使用反射获取字段值

时间:2017-06-06 17:04:01

标签: java 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;
}

}

4 个答案:

答案 0 :(得分:7)

像这样......

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方法在运行时获取对象的实例。您仍然需要先设置该实例变量,否则它将没有任何值。

E.g。

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我刻意将这里创建的对象的转换省略为预期的类型,因为这会破坏反射点,因为如果你这样做,你已经知道了这个类,这将否定对反思首先。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您可以从类对象创建实例,并且可以在字段获取值中使用。

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

答案 3 :(得分:0)

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

您的考试类:

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

希望这有帮助!

相关问题