Java 避免生成最终访问器方法

Java 避免生成最终访问器方法,java,byte-buddy,Java,Byte Buddy,我正在使用ByteBuddy动态创建子类,以便向这些类添加方法拦截器。然而,到目前为止一切都正常,ByteBuddy为每个方法创建了finalaccessor方法。当我现在将ByteBuddy与Spring结合使用时,我得到了大量的表单消息 [main] INFO org.springframework.aop.framework.CglibAopProxy - Unable to proxy method [final void com.tngtech.jgiven.integration.s

我正在使用ByteBuddy动态创建子类,以便向这些类添加方法拦截器。然而,到目前为止一切都正常,ByteBuddy为每个方法创建了
final
accessor方法。当我现在将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日志配置,这是我想要避免的。因此,问题在于是否可以避免生成访问器,或者是否可以将ByteBuddy配置为不使它们成为
final

将这些方法标记为final的想法是避免它们被这样的代理覆盖,这将中断它们与代理的使用。同时,它们是必需的,因为它们包含调用类之外不允许的
invokespecial
调用

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

  • 方法是包私有的;即使它们不是最终的,也不能可靠地重写它们,因为它们实际上只在同一个类加载器中调度,而这个类加载器通常不是为代理类提供的
  • 这些方法被标记为合成,表示不应触及的基础结构方法

  • 我建议默认情况下排除这些方法。代理这些方法没有什么意义。

    我只是从mockito框架了解ByteBuddy。请看RaphWWW提供的链接,当您使用Spring时,您为什么使用ByteBuddy添加拦截器?使用Spring不是更好吗?我不是在开发库时直接使用Spring。只有在Spring应用程序的上下文中使用该库时才会出现问题。我已经担心您会给出这样的答案;-)。我完全同意Spring在打印这样的警告之前应该更聪明。然而,问题是,从库开发人员的角度来看,我不可能修改用户对Spring配置的操作。告诉用户调整他们的日志配置和/或Spring配置有点不令人满意。我理解这一点,我也知道这一点。我仍然会向Spring提出这个问题,因为许多JVM语言生成合成访问器,这不是一个特定于字节的问题,而是Spring应该提出的问题。你提出过诉讼吗?排除包私有,合成方法似乎非常合理。是的,我同意ByteBuddy在这里没有错。不过,我希望ByteBuddy中有某种方法可以修改访问器的生成,这样Spring就不会抱怨了。我想在这里没什么可做的。我肯定也会针对Spring提交一个bug,但我担心答案会是:关闭日志;-)。谢谢你的回答!理论上,您可以创建自定义实现上下文,并将其注册到您的byte buddy实例中。如果您想要重构默认实现以允许自定义修饰符并向我发送pr,我将合并它。