2013-11-01 34 views
1

我正在處理一個處理java類元數據(字節碼和反射)的基礎編程項目。有一個很常見的情況,以確定:是否有任何算法來判斷運行時的Java方法重寫?

  • 是否一個方法有一個註釋
  • 如何確定兩種方法是否具有相同的註解,並的方法之一,覆蓋另一種方法?

對於第一個問題,設想有兩種類:T級和S級如下:

public class T<O extends T<?>> { 

    public void print(S o) {} 
    @Transition 
    public void print(O o) {} 
} 

public class S extends T<S> { 

    @Override 
    public void print(S o) {} 
} 

如果API希望成爲智能並啓用API用戶將@Transition上超類或接口,那麼它會產生與將@Transition放在子類的覆蓋方法上相同的效果。現在我不確定這是否可行,我如何確定哪些方法S.print(S)在類T中覆蓋?

對於第二問題,代碼變爲如下:

public class T<O extends T<?>> { 

    @Transition 
    public void print(S o) {} 
    @Transition(type=Redo.class) 
    public void print(O o) {} 
} 

public class S extends T<S> { 

    @Override 
    @Transition(type=Redo.class) 
    public void print(S o) {} 
} 

有是重做@Transition方法可以通過類層次結構來只被定義一次類型的約束。因此,在驗證此約束的運行時,如何確定S.print(S)覆蓋T.print(S)或T.print(O),並且它會產生不同的結果?情況可能更加模糊。由於它更像jvm或編譯器的本地特性,有沒有可用的算法?或者有可能實現這一目標?或者我應該找一些其他方向?

+1

你確定你的第二個例子編譯? –

+0

是的,它編譯。你可以試試。至少在我的Eclipse中。 –

+0

有點相關:https://stackoverflow.com/questions/12133817/determining-if-a-method-overrides-another-at-runtime。您可能會考慮修改現有的Java編譯器,或者至少研究一個,以查看在檢查「@ Override」時它如何使方法超越決定。 –

回答

1

java.lang.reflect.Method中有

public Class<?>[] getExceptionTypes() 
public <T extends Annotation> T getAnnotation(Class<T> annotationClass) 
public Annotation[] getDeclaredAnnotations() 

猜你可以用它們來獲得註釋,並獲得類列表中hierarhy根。

+0

謝謝兄弟。但我不僅要求一個子類方法的getAnnotation,而且它也是被覆蓋的接口的方法和超類的方法。問題是我無法找到哪個方法被覆蓋,而泛型被涉及,特別是它有時候會模糊。 –

0

如果Method.getDeclaringClass()從您從中獲得Method的類返回一個不同的值,那麼這是一個覆蓋或接口實現,並且您可以通過查看聲明類來告訴它。

+0

感謝兄弟,訪問模式可能不一樣。我想查找所有被子類方法覆蓋的方法,並獲取它們上的所有註釋。如果我不能得到想要的方法,我該如何使用Method.getDeclaringClass()? –

相關問題