簡體   English   中英

使用反射,獲取對象的父類/字段

[英]Using reflection, get the parent class/field of an object

在Java中是否可以使用對象的實例及其類類型來獲取對象的“父”類?

可以說我們有這兩種類類型和注釋類型:

public class Foo{

}

public class Bar{

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

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

}

我想使用Foo的實例獲取mFooField對象,否則為null ,我將使用TestAnnotation test = field.TestAnnotation(SQLiteID.class);獲得注釋TestAnnotation test = field.TestAnnotation(SQLiteID.class);


我想要的最終結果是知道Foo實例是否是包含特定注釋的另一種類型的一部分

這似乎很遙不可及,所以我不認為這是可能的。

通常這是不可能/可行的。

同一對象實例可以具有多個名稱 -也就是說,可以將同一對象同時分配給許多不同的靜態字段,實例字段,參數,局部變量(等)。

所有“解決方案”都涉及對所有此類變量的某種形式的迭代,這幾乎是不可行的,應避免此類常規設計。 即使在域減少的情況下(例如帶有注釋),仍然存在類似的問題-即如何找到所述域的所有此類根(具有成員具有特定注釋的對象實例)?

我想使用Foo的實例獲取mFoo的Field對象。

這是在做事倒退,不可能。

您可以通過測試其類型來獲取“ BarField ”,然后嘗試檢索特定的注釋

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實例的字段值進行比較。

Java中是不可能 通過編寫JVM代理 ,這是可能的,但是由於所有記賬工作,可能會嚴重降低性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM