避免生成最终的访问方法

时间:2017-01-19 20:09:52

标签: java byte-buddy

我正在使用ByteBuddy动态创建子类以向这些类添加方法拦截器。到目前为止,一切正常,ByteBuddy为每个方法创建final访问器方法。当我现在将ByteBuddy与Spring结合使用时,我收到了大量的

形式的消息
[main] INFO org.springframework.aop.framework.CglibAopProxy - Unable to proxy method [final void com.tngtech.jgiven.integration.spring.test.proxy.GivenTestStageWithAspect$ByteBuddy$aMzxnEax.should_say_hello$accessor$7OjlyLlO()] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.

我知道我可以在Spring中调低日志级别。但是当我开发一个库时,库的每个用户都必须调整我想避免的Spring日志配置。所以问题是是否可以避免生成访问器,或者是否可以将ByteBuddy配置为不使它们final

1 个答案:

答案 0 :(得分:1)

将这些方法标记为最终的想法是避免它们被这样的代理所覆盖,这些代理会破坏它们在代理中的使用。同时,它们是必要的,因为它们包含在调用类之外不允许的invokespecial调用。

在这种情况下,我认为问题在于Spring,它甚至不应该尝试代理这些方法有两个原因:

  1. 这些方法是包私有的;它们不能被可靠地覆盖,即使它们不是最终的,因为它们只是在同一个类加载器中实际调度,而这通常不是为代理类提供的。
  2. 这些方法被标记为合成方法,表示不应触及的基础设施方法。
  3. 我建议默认排除这些方法。代理这些方法的意义非常小。