gpt4 book ai didi

java - 使用 Byte Buddy 转发方法调用

转载 作者:行者123 更新时间:2023-11-30 10:52:05 27 4
gpt4 key购买 nike

我正在尝试使用 Byte Buddy 设置一个类,该类实现给定实例的所有接口(interface)并将所有调用转发给该实例,这是我目前的代码:

import static net.bytebuddy.implementation.Forwarding.to;

static Class<?> save (state) {
return stream (state.getClass ().getMethods ())
.filter (m -> isPublic (m.getModifiers ()))
.reduce ((Builder<?>) new ByteBuddy ().subclass (Object.class)
.implement (state.getClass ().getInterfaces ()),
(b, m) -> {
System.out.println ("Setting up method " + m.getName ());
return b.define (new ForLoadedMethod (m))
.intercept (to (state));
}, (x, y) -> {
throw new UnsupportedOperationException ();
}).make ().load (state.getClass ()
.getClassLoader (), INJECTION).getLoaded ();
}

public static void main (String[] args) throws Throwable {
System.out.println ("Saved: " + save (new Integer (1)).newInstance ().toString ());
}

这会导致如下异常:

Exception in thread "main" java.lang.IllegalArgumentException: Cannot forward public boolean net.bytebuddy.renamed.java.lang.Object$ByteBuddy$rwGGy3NN.equals(java.lang.Object) to class java.lang.Integer
at net.bytebuddy.implementation.Forwarding$Appender.apply(Forwarding.java:337)
at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod$WithBody.applyBody(TypeWriter.java:510)
at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod.apply(TypeWriter.java:444)

我可以在 Forwarding 下看到注释,它要工作 必须在给定委托(delegate)目标的父类(super class)型上定义拦截方法 但我不确定那意味着什么。如果这意味着我应该对生成的类进行子类化,那么如果我的目标是 final 类怎么办?我还能如何创建将转发这些调用的自定义实现?

另外,既然我来了,我怎么能指定一个通用的接口(interface)类型来实现呢?它是来自加载的 java.lang.reflect.Type 还是来 self 想动态创建的东西?

最佳答案

转发实现的工作方式类似于反射 API,其中目标需要是可分配类型。由于您没有将 Integer 子类化(无论如何这是不可能的),因此转发委托(delegate)失败。

我认为您正在寻找 MethodCall 委托(delegate),您可以在其中显式命名要调用的方法。这对你有用吗?

最后,实现通用类型是 0.8 版计划的一项功能。我已经取得了很好的进展,希望在 2016 年 1 月内准备好发布候选版本。我还计划重新访问转发委托(delegate),基于签名的调用应该不会太难实现。

关于java - 使用 Byte Buddy 转发方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34500112/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com