是否有任何算法可以在运行时判断Java的方法重写?

是否有任何算法可以在运行时判断Java的方法重写?,java,overriding,Java,Overriding,我正在从事一个基础编程项目,该项目大量处理java类元数据(字节码和反射)。有一种非常常见的情况需要识别: 方法是否有注释 如何确定两个方法是否具有相同的注释,其中一个方法是否覆盖另一个方法 对于第一个问题,假设有两个类:T类和S类,如下所示: public class T<O extends T<?>> { public void print(S o) {} @Transition public void print(O o) {} }

我正在从事一个基础编程项目,该项目大量处理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) {}
}

公共类Tjava.lang.reflect.Method

public Class<?>[] getExceptionTypes()
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
public Annotation[] getDeclaredAnnotations()
public类[]getExceptionTypes()
公共getAnnotation(类annotationClass)
公共批注[]getDeclaredAnnotations()

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

java.lang.reflect.Method

public Class<?>[] getExceptionTypes()
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
public Annotation[] getDeclaredAnnotations()
public类[]getExceptionTypes()
公共getAnnotation(类annotationClass)
公共批注[]getDeclaredAnnotations()

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

If-Method.getDeclaringClass()返回一个与从中获取方法的类不同的值,它是一个重写或接口实现,您可以通过查看声明类来判断哪个值。

If-Method.getDeclaringClass()返回与从中获取方法的类不同的值,它是一个重写或接口实现,您可以通过查看声明的类来判断是哪个值。

您确定第二个示例可以编译吗?是的,它可以编译。你可以试试。至少在我的Eclipse中是这样。有点相关:。您可以考虑修改现有的java编译器,或者至少研究一个,看看在检查<代码> @覆盖> <代码>时,它如何使方法重写决定。您确定您的第二个示例编译吗?是的,它编译。你可以试试。至少在我的Eclipse中是这样。有点相关:。您可以考虑修改现有java编译器,或者至少研究其中一个,看看在检查<代码> >覆盖> <代码>时,它如何使方法重写决定。谢谢兄弟。但我不仅要求对子类的方法进行getAnnotation,还要求对子类的接口方法和超类的方法进行getAnnotation,这些方法都已被重写。问题是我找不到哪个方法被重写了,而泛型类型涉及其中,特别是有时它是模糊的。谢谢兄弟。但我不仅要求对子类的方法进行getAnnotation,还要求对子类的接口方法和超类的方法进行getAnnotation,这些方法都已被重写。问题是我找不到覆盖了哪个方法,而涉及泛型类型,特别是有时它是模糊的。谢谢兄弟,访问模式可能不一样。我想找到所有被子类方法重写的方法,并获取它们的所有注释。如果我找不到想要的方法,我如何使用method.getDeclaringClass()?谢谢兄弟,访问模式可能不一样。我想找到所有被子类方法重写的方法,并获取它们的所有注释。如果无法获得所需的方法,如何使用method.getDeclaringClass()?