使用反射,获取对象的父类/字段

时间:2013-10-12 04:17:32

标签: java reflection annotations

在Java中是否可以使用它的实例及其类类型来获取对象的“父”类?

假设我们有这两个类类型和注释类型:

public class Foo{

}

public class Bar{

    @TestAnnotation
    public Foo mFoo = new Foo();
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation{

}

我希望使用Field的实例获取mFoo Foo对象,否则使用null,我将使用{{1}获取注释}


我想要的最终结果是知道TestAnnotation test = field.TestAnnotation(SQLiteID.class);的实例是否是包含某个注释的另一种类型的一部分

这似乎相当遥远,所以我不认为它是可能的。

3 个答案:

答案 0 :(得分:4)

这一般不可行/不可行。

相同的对象实例可以有多个名称 - 也就是说,同一个对象可以分配给许多不同的 em>静态字段,实例字段,参数,局部变量(等)。

所有“解决方案”都涉及对所有此类变量的某种形式的迭代,这很少是可行的,应该避免这种一般设计。即使使用缩减的域(例如带注释),仍然存在类似的问题 - 即如何找到所有这样的根(具有成员具有特定注释的对象实例)?

答案 1 :(得分:2)

  

我想使用Foo的实例获取mFoo的Field对象。

这是向后做事而不可能。

您可以通过测试其类型获取Field Bar,然后尝试检索特定注释

Field[] fields = Bar.class.getDeclaredFields();
for (Field field : fields) {
    if (Foo.class.isAssignableFrom(field.getType())) {
        TestAnnotation testAnnotation = field.getAnnotation(TestAnnotation.class);
        System.out.println(testAnnotation); // might be null, if annotation doesn't exist
    }
}

现在,如果你有一个Foo的实例,你也可以将它与Bar实例的字段值进行比较。

答案 2 :(得分:1)

在 Java中是不可能的。这可能是writing a JVM agent,但由于所有的簿记,可能会有严重的性能损失。