当前位置: 首页 > 知识库问答 >
问题:

使用字节好友转发方法调用

麻宾白
2023-03-14

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

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)

我可以看到< code>Forwarding下面的说明,要使它工作< code >必须在给定委托目标的超类型上定义截取的方法,但我不确定这是什么意思。如果这意味着我应该对生成的类进行子类化,那么如果我的目标是一个< code>final类呢?我还能如何创建一个定制的实现来转发这些调用呢?

另外,既然我已经在这里了,我怎么能指定一个通用接口类型来实现呢?它是来自加载的< code > Java . lang . reflect . type 还是来自我想要动态创建的东西?

共有1个答案

和丰羽
2023-03-14

转发实现的工作方式类似于反射API,其中目标需要是可赋值的类型。因为您没有子类化Integer(这无论如何是不可能的),所以转发委托会失败。

我想你正在寻找MethodCall委托,在那里你可以明确地命名你想要调用的方法。这对你有用吗?

最后,实现泛型类型是计划在版本 0.8 中使用的功能。我已经取得了良好的进展,并希望在 2016 年 1 月内准备好候选版本。我还计划重新访问转发代表团,基于签名的调用应该不太难实现。

 类似资料:
  • 我从这个例子中找到了这段代码: 我实现了这段代码,但结果看起来很可疑。我试图从JVM获取可用内存量,但我只有80 MB。您能否确认此代码是否正确地将字节转换为兆字节或千兆字节。

  • **转发错误:** 当我通过angularjs+Zuul+hystrix调用POST微服务时,它显示转发异常。但是如果我通过客户机REST API或邮递员进行调用,它会提供状态的成功消息。 2017-04-24 19:09:50.315警告6196---[nio-9090-exec-6]O.S.C.N.Z.Filters.Post.SenderRorFilter:筛选时出错

  • 使用友好的 MAC 编号 默认情况下,主机跟交换机启动后分配的 MAC 地址是随机的,这在某些情况下不方便查找问题。 可以使用 --mac 选项,这样主机跟交换机分配到的 MAC 地址跟他们的 ID 是一致的,容易通过 MAC 地址较快找到对应的节点。

  • 问题内容: 是否有办法将JavaScript字符串传递给MySQL的NodeJSfriendly?我正在尝试将电子邮件地址传递给我的NodeJS服务器并查询到MySQL数据库。在执行常规文本(例如用户名)时可以正常工作,但电子邮件地址却不能。显然,使用转义不是正确的答案,因为这并不意味着要进行SQL插入。我假设我需要一些PHP函数。 问题答案: 事实证明,mysql_real_escape_str

  • 是否可以在使用者中运行方法,如方法引用,但要在传递给使用者的对象上运行: 会是这样的: 但那不起作用... 方法引用是否有可能,或者是-

  • 太长别读:我试图找到最有效的动态创建功能接口的实现,将调用转发到该接口的一组实例。 目标是简化接口的实现,通过将处理程序(实现为功能接口)传递给适当的注册函数,允许客户端代码为多个事件注册自己。例如: 这可能是这种接口的一个示例。有许多这样的接口,每个接口都有不同的事件,因此实现应该尽可能简单,没有太多重复的代码。我想这最好是通过在这样的实现中引入一个内部使用的类型来实现,它允许将调用转发到所有注