【发布时间】:2020-03-23 21:09:09
【问题描述】:
我正在整理一个非常简单的 ByteBuddy 委托/代理类。
目的是(再次,非常简单)代理一个类,使其任何非final、非private、非static 方法等都被路由到其@ 上的等效方法987654324@ 字段由其getProxiedInstance 方法返回。 (对于常见的嫌疑人应该有例外:equals、hashCode、wait和notify等等。)
我已经使用子类策略设置了我的代理类。我还定义了两个方法,getProxiedInstance 和setProxiedInstance,以及一个名为proxiedInstance 的正确类型的private 字段。我已经使用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"));
英文:not final,not static,not private,或者public String toString()方法继承自Object(或被覆盖),或 任何其他未由 Object.class 声明且未命名为 getProxiedInstance 或 setProxiedInstance 的方法。
假设我有这样的课程:
public class Frob {
public String sayHello() {
return "Hello!";
}
}
当我为它创建一个代理类,实例化它,然后在代理上调用toString(),我得到Hello!。
这以某种方式向我暗示,我上面引用的配方以某种方式将toString() 路由到sayHello()。
通过阅读MethodDelegation javadocs,似乎可能选择目标/委托对象上的sayHello 进行委托,因为它比代理上调用的方法 (toString) 更具体。我猜名字匹配的优先级低于那个。
我认为我的这个用例比较简单。我怎样才能最好地完成它?
【问题讨论】:
标签: byte-buddy