我有以下接口
public interface DatabaseClient {
void save(Entity entity, Consumer<Long> callback);
void load(long id, Consumer<Entity> callback);
}
并且该接口的实现被称为DatabaseClientImpl
。
我使用byte buddy将接口DatabaseClient
子类化。生成的类将每个方法委托给创建Invocation
记录的类。
public record Invocation(Method method, Object[] parameters) {}
Invocation
对象稍后将被传递给实现java.util.function.Consumer<Invocation>
的抽象类ProxyHandler
。我现在试图实现的是子类化ProxyHandler,并使用DatabaseClientImpl
示例上的参数调用存储在Invocation
中的方法。
这就是我到目前为止所做的。
public <T> void register(Class<T> intf, T service) throws ReflectiveOperationException {
ProxyHandler proxyHandler = new ByteBuddy()
.subclass(ProxyHandler.class)
.method(isAbstract())
// todo intercept and dynamically call method
//.intercept(MethodCall.invoke(loadMethod)
// .on(service)
// .with(1L, callback))
.make()
.load(ProxyHandler.class.getClassLoader())
.getLoaded()
.newInstance();
proxyHandler.accept(new Invocation(...));
}
public static abstract class ProxyHandler implements Consumer<Invocation> {
}
一般来说,使用MethodCall的方法是可行的,但我只是为了测试而添加它。因为除了DatabaseClient
之外还有其他接口,所以这种静态的方法是行不通的。
那么,是否有任何方法可以基于Invocation的属性将调用委托给DatabaseClientImpl呢?
1条答案
按热度按时间8ulbf1ek1#
这是一个你可以用一个简单的
Proxy
用反射/方法句柄更好地解决的问题,我假设你不需要子类化。当然,您可以使用Byte Buddy,也可以使用MethodCall
并提供额外的MethodCall
作为参数。在这些方法调用中,您将对参数值调用相应的getter。