[英]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.