jvm 调用一个基于参数与byte buddy的方法

tjvv9vkg  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(116)

我有以下接口

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呢?

8ulbf1ek

8ulbf1ek1#

这是一个你可以用一个简单的Proxy用反射/方法句柄更好地解决的问题,我假设你不需要子类化。当然,您可以使用Byte Buddy,也可以使用MethodCall并提供额外的MethodCall作为参数。在这些方法调用中,您将对参数值调用相应的getter。

相关问题