我正在开发一个基础编程项目,它正在处理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放在超类或接口上,那么它将产生与将子类放在子类的重写方法上相同的效果。现在我不确定这是否可行,如何确定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) {}
}
有一个约束,即Redo类型@Transition方法只能通过类层次结构定义一次。因此,在运行时验证此约束时,如何确定S.print(S)会覆盖T.print(S)或T.print(O),并且它会产生不同的结果?情况可能更加模棱两可。由于它更像是jvm或编译器的原生功能,有没有可用的算法?或者有可能实现这一目标吗?或者我应该找到其他方向吗?
答案 0 :(得分:1)
java.lang.reflect.Method有
public Class<?>[] getExceptionTypes()
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
public Annotation[] getDeclaredAnnotations()
猜猜您可以使用它们来获取注释并获取类别到hierarhy root的列表。
答案 1 :(得分:0)
如果Method.getDeclaringClass()从您获得Method的类中返回一个不同的值,它是一个覆盖或接口实现,您可以通过查看声明类来判断哪一个。