0

有什么方法可以从实例(而不是类)获取字段引用?

这是一个例子:

public class Element {
    @MyAnnotation("hello")
    public String label1;

    @MyAnnotation("world")
    public String label2;
}

public class App {
    private Element elem = new Element();

    public void printAnnotations() {
        String elemLabel1 = elem1.label;
        String elemLabel2 = elem2.label;

    // cannot do elemLabel.getField().getDeclaredAnnotations();
        String elemLabel1AnnotationValue = // how ? 
        String elemLabel2AnnotationValue = // how ? 
    }
}

抱歉不太清楚,但我已经知道如何从类中获取字段(类 --> 字段 --> DeclaredAnnotations)

我想知道的是如何获取特定实例的字段。在这个例子中,从 elemLabel1 字符串实例,我希望能够获得 Element.label1 的字段。

4

2 回答 2

2

你到底什么意思?A Fieldon 定义在Class. 您可以获得特定实例的值:-

private static class Test {
    private int test = 10;
}

public static void main(String[] args) throws Exception {
    final Test test = new Test();
    final Field field = Test.class.getDeclaredField("test");
    field.setAccessible(true);
    final int value = field.getInt(test);
    System.out.println(value);
}

class Test一个Fieldtest. 任何情况都是如此Test- 它在Class. 在这种情况下, is 的实例class具有特定的值。这可以使用or方法为特定实例检索。Field10getXXXget

编辑

从您问题中的代码看来,您想要的是Annotation字段的值而不是字段的值class

在 Java 中,注解中的值是编译时常量,因此也是在class而非实例级别定义的。

public class Element {
    @MyAnnotation("l")
    public String label;
}

在您的示例中,value字段必须MyAnnotation等于.1Element

于 2013-05-13T06:28:25.503 回答
2

Field属于类。因此,您实际上想要执行以下操作:

elemLabel.getClass().getField("theFieldName").getDeclaredAnnotations();

但是,尽管您的字段public通常是所有字段都应该是private. 在这种情况下,使用getDeclaredField()而不是getField().

编辑您必须field.setAccessible(true)在使用该字段之前调用。

于 2013-05-13T06:29:34.953 回答