是否有任何算法来判断运行时Java的方法覆盖?

时间:2013-11-01 06:48:20

标签: java override

我正在开发一个基础编程项目,它正在处理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或编译器的原生功能,有没有可用的算法?或者有可能实现这一目标吗?或者我应该找到其他方向吗?

2 个答案:

答案 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的类中返回一个不同的值,它是一个覆盖或接口实现,您可以通过查看声明类来判断哪一个。