使用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我故意将这里创建的对象的转换省略为预期的类型,因为这会破坏reflection的点,因为如果你这样做,你已经知道了类,这将否定reflection的需要。第一名。

你需要在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); 

所以,得到了以下答案。 它现在工作正常。 不确定这是否是最好的。

你的考试class:

 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访问修饰符访问了变量,但是我的访问变量很少,因此我的安全警告很少。 只是免责声明!

希望这可以帮助!