我正在从事一个基础编程项目,该项目经常处理 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 或者编译器的原生特性,那么有没有可用的算法呢?或者有可能实现这一目标吗?或者我应该找到其他方向吗?