2013-11-01 36 views
1

我正在处理一个处理java类元数据(字节码和反射)的基础编程项目。有一个很常见的情况,以确定:是否有任何算法来判断运行时的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或编译器的本地特性,有没有可用的算法?或者有可能实现这一目标?或者我应该找一些其他方向?

+1

你确定你的第二个例子编译? –

+0

是的,它编译。你可以试试。至少在我的Eclipse中。 –

+0

有点相关:https://stackoverflow.com/questions/12133817/determining-if-a-method-overrides-another-at-runtime。您可能会考虑修改现有的Java编译器,或者至少研究一个,以查看在检查“@ Override”时它如何使方法超越决定。 –

回答

1

java.lang.reflect.Method中有

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

猜你可以用它们来获得注释,并获得类列表中hierarhy根。

+0

谢谢兄弟。但我不仅要求一个子类方法的getAnnotation,而且它也是被覆盖的接口的方法和超类的方法。问题是我无法找到哪个方法被覆盖,而泛型被涉及,特别是它有时候会模糊。 –

0

如果Method.getDeclaringClass()从您从中获得Method的类返回一个不同的值,那么这是一个覆盖或接口实现,并且您可以通过查看声明类来告诉它。

+0

感谢兄弟,访问模式可能不一样。我想查找所有被子类方法覆盖的方法,并获取它们上的所有注释。如果我不能得到想要的方法,我该如何使用Method.getDeclaringClass()? –

相关问题