在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);
的实例是否是包含某个注释的另一种类型的一部分
这似乎相当遥远,所以我不认为它是可能的。
答案 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,但由于所有的簿记,可能会有严重的性能损失。