我正在處理一個處理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或編譯器的本地特性,有沒有可用的算法?或者有可能實現這一目標?或者我應該找一些其他方向?
你確定你的第二個例子編譯? –
是的,它編譯。你可以試試。至少在我的Eclipse中。 –
有點相關:https://stackoverflow.com/questions/12133817/determining-if-a-method-overrides-another-at-runtime。您可能會考慮修改現有的Java編譯器,或者至少研究一個,以查看在檢查「@ Override」時它如何使方法超越決定。 –