本帖最后由 xingshen100 于 2013-12-24 21:18:16 编辑

解决方案 »

  1.   

    仔细看了LZ的博客,思考了下,那个注解之所以在Method层面不行,是因为对父类或接口的重写方法时,并没有手动加注解(因为java中的重写,只是针对方法本身,注解是后来出现的东西,并不会影响重写方法合法性判断上)。如果想要保留,需要在子类方法中明确。对于不重写的方法,其本质上是使用的父类的方法,因此注解保留是理所当然的。至于代理注解,恰好最近也用到了。实际上代理最终会通过一个类似$Proxy0的这样一个类实现代理功能的。我想,jvm在生成$Proxy0这个类时,是严格拷贝了其接口对应的方法定义(你即使去掉Inherited注解,代理依然会传递接口中的注解)。
    假设存在接口:
    public interface MyIntf{
       @myannotation("abc")
       void test();
    }Proxy生成$Proxy0的时候,也会严格将其实现接口的注解继承下来:
    class $Proxy0 extends Proxy implements MyIntf{
       @myannotation("abc")
       void test(){}
    }
      

  2.   

    后面你的猜想果然是正确的,我把@Inherited()元注解去掉,再测试同样有效。