我正在整理一个非常简单的ByteBuddy委托/代理类。
意图(再次非常简单)是对类进行代理,以使其非final
,非private
,非static
方法等中的任何一个路由到其[C0 ]字段,由其proxiedInstance
方法返回。 (应为通常的嫌疑人设置例外:getProxiedInstance
,equals
,hashCode
和wait
,依此类推。)
我已经使用子类策略设置了代理类。我还定义了两个方法notify
和getProxiedInstance
,以及正确类型的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()
声明且未命名为Object
或Object.class
。
假设我有这样的课程:
getProxiedInstance
当我为其创建代理类时,将其实例化,然后在代理上调用
setProxiedInstance
,则得到public class Frob { public String sayHello() { return "Hello!"; } }
。
这以某种方式向我暗示,我上面引用的配方以某种方式将toString()
路由到Hello!
。
[从阅读toString()
javadocs以来,似乎选择了目标/委托对象上的sayHello()
作为委派,因为它比在代理(MethodDelegation
)上调用的方法更具体。我想名称匹配的优先级比这低。
我认为我拥有的这个用例相对简单。我如何最好地完成它?
我正在整理一个非常简单的ByteBuddy委托/代理类。意图是(再次非常简单)代理类,以使其任何非最终的,非私有的,非静态的方法等等……
Method
是一种更好的方法。 Object.class.getMethod("toString")
用于“捕获所有代理”,其中您将相应的调度程序注入到通常是单个委托方法(可能是两个)中。方法调用还具有更高的性能,因为它不需要执行分析,而只需重新路由到兼容类型的方法即可。