2013-10-12 94 views
0

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);


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

這似乎相當遙遠,所以我不指望它是可能的。

+0

您是否試圖瞭解某些註解的類是否擁有對'mFoo'中實例的引用? – chrylis

+0

正確,我對Java的理解說,這是不可能的,但我想知道是否有人有新的東西我沒有關於它 – FabianCook

回答

3

這是不可能的/一般可行的。

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

所有的「解決方案」都涉及對所有這些變量的某種形式的迭代,這是很少可行的,應該避免這樣的一般設計。即使縮小的域(例如註釋)也存在類似的問題 - 即如何找到所述域的這樣的根(具有特定註釋的成員的對象實例)的全部

+0

同意,更多的討論問題。 – FabianCook

1

我想使用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

+0

我正在考慮將'Bar'對象傳遞給' Foo',但我不相信它會以任何方式可行 – FabianCook

+0

@SmartLemon你是什麼意思_將Bar對象傳遞給Foo_? –

+0

就像在構建對象Foo時它是父對象一樣,我可以傳遞我正在使用Foo的Bar對象的實例。 – FabianCook

1

這是不可能的in爪哇。這將有可能通過writing a JVM agent,但由於所有簿記可能會有嚴重的性能損失。

相關問題