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