在这种情况下,为什么将ByteBuddy路由方法委派给“错误”方法?

问题描述 投票:0回答:2

我正在整理一个非常简单的ByteBuddy委托/代理类。

意图(再次非常简单)是对类进行代理,以使其非final,非private,非static方法等中的任何一个路由到其[C0 ]字段,由其proxiedInstance方法返回。 (应为通常的嫌疑人设置例外:getProxiedInstanceequalshashCodewait,依此类推。)

我已经使用子类策略设置了代理类。我还定义了两个方法notifygetProxiedInstance,以及正确类型的setProxiedInstance字段。我已经使用private策略做到了这一点。为了简洁起见,我在这里省略了它。实际上,该类确实包含此字段和这两个方法。

然后,我像这样定义了方法拦截,静态地导入了相关的proxiedInstance方法:

FieldAccessor.ofBeanProperty()

英文:不是ElementMatchers,不是builder .method(not(isFinal()).and(not(isStatic())).and(not(isPrivate())) .and((isPublic().and(named("toString")).and(takesArguments(0)).and(returns(String.class))) .or((not(isDeclaredBy(Object.class)).and(not(named("getProxiedInstance"))).and(not(named("setProxiedInstance")))))) ) .intercept(MethodDelegation.toMethodReturnOf("getProxiedInstance")); ,不是final,并且任一个>]从static继承(或重写)的private方法,其他不是由public String toString()声明且未命名为ObjectObject.class

假设我有这样的课程:

getProxiedInstance

当我为其创建代理类时,将其实例化,然后在代理上调用setProxiedInstance,则得到public class Frob { public String sayHello() { return "Hello!"; } }

这以某种方式向我暗示,我上面引用的配方以某种方式将toString()路由到Hello!

[从阅读toString() javadocs以来,似乎选择了目标/委托对象上的sayHello()作为委派,因为它比在代理(MethodDelegation)上调用的方法更具体。我想名称匹配的优先级比这低。

我认为我拥有的这个用例相对简单。我如何最好地完成它?

我正在整理一个非常简单的ByteBuddy委托/代理类。意图是(再次非常简单)代理类,以使其任何非最终的,非私有的,非静态的方法等等……

byte-buddy
2个回答
0
投票
我能做的最好的方法是可行的,但是似乎有点笨拙或冗长,是这样的:

0
投票
我认为使用Method是一种更好的方法。 Object.class.getMethod("toString")用于“捕获所有代理”,其中您将相应的调度程序注入到通常是单个委托方法(可能是两个)中。方法调用还具有更高的性能,因为它不需要执行分析,而只需重新路由到兼容类型的方法即可。
© www.soinside.com 2019 - 2024. All rights reserved.