1

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

4

2 回答 2

1

java.lang.reflect.Method 有

public Class<?>[] getExceptionTypes()
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
public Annotation[] getDeclaredAnnotations()

猜猜您可以使用它们来获取注释并将类列表获取到层次结构根。

于 2013-11-01T07:14:13.267 回答
0

如果 Method.getDeclaringClass() 返回的值与您从中获取 Method 的类不同,则它是覆盖或接口实现,您可以通过查看声明类来判断哪个。

于 2013-11-01T07:48:33.503 回答