这是我的问题...
我在包 pkg3 中有一个注释:
package pkg3;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TestAnno {
}
另外我在包 pkg1 中有两个类,一个具有公共访问权限,一个具有默认访问权限
package pkg1;
import pkg3.TestAnno;
class Class1 {
@TestAnno
public void test1() { }
public void test2() { }
}
和
package pkg1;
import pkg3.TestAnno;
public class Class2 extends Class1 {
@TestAnno
public void test3() { }
public void test4() { }
}
最后我在包 pkg2 中有一个主类
package pkg2;
import java.lang.reflect.Method;
import pkg1.Class2;
import pkg3.TestAnno;
public class MainClass {
public static void main(String[] args) {
Class2 cls = new Class2();
for(Method m: cls.getClass().getMethods()) {
System.out.println(m);
if (m.getAnnotation(TestAnno.class) != null) {
System.out.println(" > hass anno");
}
}
}
}
运行这个例子我希望看到信息,两个方法有@TestAnno存在 - test1和test3,但我只看到一个test3,而且......奇怪的是,方法test1和test2被列出,因为它们被声明在类 2 类。
public void pkg1.Class2.test3()
> hass anno
public void pkg1.Class2.test4()
public void pkg1.Class2.test1()
public void pkg1.Class2.test2()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
... rest methods from java.lang.Object
我知道,getMethods 只返回给定玻璃的公共方法(而且都是超类)但是......这对我来说很奇怪。
我使用它是为了将生成的类(具有默认访问权限)与实现类(它们是公共的并且它们正在扩展生成的类)分开。我是否在生成的类中使用公共访问(我希望它们对世界其他地方不可见)或者有什么方法可以从 Class1 获取带注释的公共方法?