我试图使用Spring将行为注入到对象中。目标对象有一个方法,它是这个新行为的连接点。该方法还具有一个自定义注释,我希望能够从其他无关代码中读取该注释。因为我的类没有实现接口,Spring使用CGLIB动态子类目标对象。生成的子类似乎没有将注释添加到原始类中。
我尝试在没有运气的情况下将@继承注释添加到自定义注释中。事实证明,“继承”只适用于类。这表明Spring必须显式地将我的注释应用于子类中的重写方法。
编辑:我找到了一个解决办法和一些关于这个问题的更多信息。看来CGLib的人已经意识到了这个问题。注释被视为Java中的实现(而不是方法签名的一部分)。重写方法必须重新声明注释.CGLib不会这么做(通过事物的声音)。
我的解决办法是改变我的反思逻辑。当我搜索传递给我的类上的带注释的方法时,我现在看这个类,它是超类。最后,我使用超类来定位方法(在代理的情况下),但是当我调用该方法时,就会应用普通的polymorphisim。这就产生了一些丑陋的反射代码(甚至比正常情况更难看)。看起来,我也不应该对代码中的SpringAOP实现细节进行补偿。
看起来Spring应该提供一种更干净的方法来处理这个问题。如果有人有其他建议,我们将不胜感激。
发布于 2009-07-01 15:29:43
您确定将注释上的RetentionPolicy设置为运行时吗?
https://stackoverflow.com/questions/1069460
复制相似问题