簡體   English   中英

使用反射獲取字段值

[英]Get field values using reflection

我無法獲得字段值。我想要做的是在運行時獲取Object。 請讓我知道我哪里出錯了。

的Test.class

import java.lang.reflect.Field;

public class Test {

public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException,
        IllegalArgumentException, IllegalAccessException {

    final Field field = Class.forName("com.logging.EX").getDeclaredField("value");
    field.setAccessible(true);
    field.get(Class.forName("com.logging.EX"));
}

}

EX.class

public class EX {

private String value;


public EX(){
    value="data";
}
/**
 * @return the value
 */
public String getValue() {
    return value;
}

/**
 * @param value
 *            the value to set
 */
public void setValue(String value) {
    this.value = value;
}

}

像這樣......

import java.lang.reflect.Field;

public class Test {
    public static void main(String... args) {
        try {
            Foobar foobar = new Foobar("Peter");
            System.out.println("Name: " + foobar.getName());
            Class<?> clazz = Class.forName("com.csa.mdm.Foobar");
            System.out.println("Class: " + clazz);
            Field field = clazz.getDeclaredField("name");
            field.setAccessible(true);
            String value = (String) field.get(foobar);
            System.out.println("Value: " + value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Foobar {
    private final String name;

    public Foobar(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}

或者,您可以使用類的newInstance方法在運行時獲取對象的實例。 您仍然需要先設置該實例變量,否則它將沒有任何值。

例如

Class<?> clazz = Class.forName("com.something.Foobar");
Object object = clazz.newInstance();

或者,它的構造函數中有兩個參數,例如String和int ......

Class<?> clazz = Class.forName("com.something.Foobar");
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("Meaning Of Life", 42);

或者您可以使用clazz.getConstructors()在運行時查詢其構造函數

NB我故意省略了在這里創建的對象的轉換為預期的類型,因為這會破壞反射點,因為如果你這樣做,你已經知道了類,這將否定反射的必要性。第一名。

你需要在field.get()上使用EX isntance。

final Field field = Class.forName("com.logging.EX").getDeclaredField("value");
field.setAccessible(true);
field.get(new EX());

您可以從類對象創建實例,並且可以在字段獲取值中使用。

 Class modelClass = Class.forName("com.gati.stackoverflow.EX");
    final Field field = modelClass.getDeclaredField("value");
    field.setAccessible(true);
    Object modelInstance=modelClass.newInstance();
    field.get(modelInstance);

所以,得到了以下答案。 它現在工作正常。 不確定這是否是最好的。

你的考試班:

public class Test {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException,
            IllegalArgumentException, IllegalAccessException, InstantiationException {

        Field[] fields = Class.forName("com.logging.EX").newInstance().getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            System.out.println(field.getName() + " : " + field.get(Class.forName("com.logging.EX").newInstance()));
        }

    }
}

我通過調用com.logging.EX的實例將所有字段提取到數組中,然后遍歷所有字段並提取字段所包含的名稱和值。 這里沒有硬編碼任何字段名稱。

由於我使用private訪問修飾符訪問變量,但是我的訪問變量很少,因此我的安全警告很少。 只是免責聲明!

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM