我正在处理一个处理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”时它如何使方法超越决定。 –