避免生成最终访问器方法
Avoid generation of final accessor methods
我正在使用 ByteBuddy 动态创建 sub类 以向这些 类 添加方法拦截器。到目前为止一切正常,但是,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$accessorOjlyLlO()] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.
我知道我可以调低 Spring 中的日志级别。但是当我开发一个库时,库的每个用户都必须调整我想避免的 Spring 日志配置。所以问题是是否可以避免生成访问器,或者是否可以将 ByteBuddy 配置为不生成它们 final
.
将这些方法标记为最终方法的想法是避免它们被此类代理覆盖,这会破坏它们在代理中的使用。同时,它们是必要的,因为它们包含 invokespecial
调用,这些调用在调用 class.
之外是不允许的
在这种情况下,我认为问题在于 Spring,它甚至不应该尝试代理这些方法,原因有二:
- 方法是package-private;即使它们不是最终的,也不能可靠地覆盖它们,因为它们实际上仅在同一个 class 加载程序中分派,而代理通常不会提供 class.
- 这些方法被标记为合成方法,表示不应触及的基础结构方法。
我建议默认排除此类方法。代理这些方法没有什么意义。
我正在使用 ByteBuddy 动态创建 sub类 以向这些 类 添加方法拦截器。到目前为止一切正常,但是,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$accessorOjlyLlO()] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.
我知道我可以调低 Spring 中的日志级别。但是当我开发一个库时,库的每个用户都必须调整我想避免的 Spring 日志配置。所以问题是是否可以避免生成访问器,或者是否可以将 ByteBuddy 配置为不生成它们 final
.
将这些方法标记为最终方法的想法是避免它们被此类代理覆盖,这会破坏它们在代理中的使用。同时,它们是必要的,因为它们包含 invokespecial
调用,这些调用在调用 class.
在这种情况下,我认为问题在于 Spring,它甚至不应该尝试代理这些方法,原因有二:
- 方法是package-private;即使它们不是最终的,也不能可靠地覆盖它们,因为它们实际上仅在同一个 class 加载程序中分派,而代理通常不会提供 class.
- 这些方法被标记为合成方法,表示不应触及的基础结构方法。
我建议默认排除此类方法。代理这些方法没有什么意义。