问题标签 [lambda-metafactory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1151 浏览

java - LambdaMetafactory 访问不同 ClassLoader 上的类

我有这个工作正常的代码:

但是如果getterMethod是从不同的 ClassLoader 加载的类的方法,它会抛出:

如何将我的ClassLoader实例传递给LambdaMetafactory?

0 投票
1 回答
631 浏览

java - 使用多个 vargs 调用 Java LambdaMetaFactory 方法以避免反射

我目前正在使用 Java 反射

我用反射做这件事没有任何问题。我了解到 LambdaMetaFactory 比反射具有更好的性能.. 有关于 getter 和 setter 的示例.. 但是没有像 doSomethig(String a, String b, int c) 这样的多参数化方法的示例;

这是我正在做的反思

我想在这里添加另一种支持 LambdaMetaFactory 的方法我正在尝试什么

没有参数我在 switch case default 和 Function 上没有任何问题,但是有参数我无法运行它这是我的 MethodFunctionArgs @FunctionalInterfaces

无论如何要这样做?没有很多示例或教程,只有 getter 和 setter 也许有一种方法可以使用 varags 创建动态 @functionalinterface?

谢谢你的帮助...

0 投票
1 回答
1822 浏览

java - 使用 LambdaMetafactory 在从其他类加载器获取的类实例上调用单参数方法

基于this stackoverflow answer,我正在尝试使用反射实例化一个类,然后使用它调用一个单参数方法LambdaMetafactory::metafactory(我尝试使用反射,但它相当慢)。

更具体地说,我想创建一个 的实例,并使用以下签名com.google.googlejavaformat.java.Formatter调用它的方法: .formatSource()String formatSource(String input) throws FormatterException

我定义了以下功能接口:

并尝试执行以下代码:

当我运行此代码时,调用LambdaMetafactory::metafactory失败并出现以下异常:

我已经阅读了一些关于 stackoverflow 的答案LambdaMetafactory并阅读了LambdaMetafactory文档,但无法弄清楚我做错了什么。我希望其他人能够做到。

预先感谢您的帮助。

0 投票
2 回答
1165 浏览

java - 具有泛型类型的具体实现的 LambdaMetaFactory

我正在尝试使用 JavaLambdaMetaFactory来动态实现通用 lambda Handler<RoutingContext>,:

这是我的尝试LambdaMetaFactory

这给出了错误:

functionMethodType我已经为and尝试了一系列其他选项implementationMethodHandle,但还没有设法让它工作。此外,即使我将RoutingContext.class引用替换为Object.class,这也不能修复错误。

我可以使lambda.handle(ctx)调用成功的唯一方法是通过更改HomeHandler使其不扩展Handler,使其成为HomeHandler::handle静态并更改RoutingContext.classObject.class. 奇怪的是,我仍然可以将生成的 lambda 转换为Handler<RoutingContext>,即使它不再扩展Handler

我的问题:

  1. 如何LambdaMetaFactory使用非静态方法?

  2. 对于这个非静态 SAM 类HomeHandler,它如何在后台使用实例分配?是否LambdaMetaFactory创建接口实现的单个实例,无论有多少方法调用,因为在此示例中没有捕获的变量?或者它是否为每个方法调用创建一个新实例?还是我应该创建一个实例并以某种方式将其传递给 API?

  3. 如何LambdaMetaFactory使用泛型方法?

编辑:除了下面的好答案之外,我还看到了这篇博客文章,解释了所涉及的机制:

https://medium.freecodecamp.org/a-faster-alternative-to-java-reflection-db6b1e48c33e

0 投票
1 回答
426 浏览

java - 如何在运行时使用 LambdaMetafactory 访问动态类中的非静态方法

我正在尝试使用 LambdaMetafactory 来替换反射,但我有一个问题。如果我使用特定的类,那么它工作得很好,就像这样:

但是如果我Class<?>用来替换特定的类,那么它就不起作用了,就像这样:

这是一个例外:

第 182 行是:

我知道只使用静态方法可以解决这个问题,但我想知道有没有其他方法可以在不将非静态更改为静态的情况下解决它。

这是getInstance:

在这个方法中,我使用反射在Class中找到静态方法getInstance,并返回一个实例,它只是一个简单的单例。

0 投票
2 回答
501 浏览

java - 如何使用 LambdaMetaFactory 实例化对象?

我有一个界面动作:

类 SimpleAction:

类复杂动作:

我想创建一个函数,它采用类的名称并返回该类的对象。这就是我迄今为止在我的职能中所拥有的 -

0 投票
1 回答
352 浏览

java-8 - 如何使用 LambdaMetafactory 调用默认构造函数

在链接中: 如何使用 LambdaMetaFactory 实例化对象?提到了如何使用 LambdaMetafactory 实例化一个单参数的构造器。

我正在尝试对默认构造函数执行相同的操作,但由于以下错误而失败:

我试图运行的代码:

测试类

为了使用 LambdaMetafactory 调用默认构造函数,我做错了什么?

0 投票
1 回答
243 浏览

java - 使用 LambdaMetafactory 创建 CallSite 时我自己的类的 NoClassDefFoundError

我正在尝试创建一个小型实用程序来代替我在整个项目中使用反射(主要是为了使用 LambdaMetafactory 的性能优势),但我在创建 CallSite 时遇到了麻烦。但是,仅在访问不是我自己的类时才会出现此问题。访问 3rd 方库甚至 Java 自己的类(例如 java.lang.Object)将导致 NoClassDefFoundError 不是针对 3rd 方类,而是针对我的接口。

我运行的单元测试证明了这个问题可以在这里找到:

这将抛出以下内容:

java.lang.NoClassDefFoundError: com/gmail/justisroot/autoecon/data/AccessorTest$ToString at java.base/jdk.internal.misc.Unsafe.defineAnonymousClass0(Native Method) at java.base/jdk.internal.misc.Unsafe。在 java.base/java.lang.invoke.InnerClassLambdaMetafactory.buildCallSite(InnerClassLambdaMetafactory.java:188) 的 java.base/java.lang.invoke.InnerClassLambdaMetafactory.spinInnerClass(InnerClassLambdaMetafactory.java:320) 的 defineAnonymousClass(Unsafe.java:1223)在 java.base/java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:317) 在 com.gmail.justisroot.autoecon.data.Accessor.to(Accessor.java:43)

我已经花了太多时间绞尽脑汁寻找解决方案。第二双眼睛肯定会有所帮助。

我究竟做错了什么?

0 投票
0 回答
114 浏览

java - 使用 LambdaMetaFactory 调用任意构造函数

假设我正在编写一个反序列化实用程序,并且希望性能比反射更好。

我有一个Map<Class, MethodHandle>,其中 MethodHandle 是给定类的所需构造函数。当用户调用T deserialize(ByteBuffer, Class<T>)时,它会从 Map 中获取相应的 MethodHandle,从缓冲区中获取构造函数参数,然后调用MethodHandle::invoke. 这很好用。

问题是,除非 MethodHandle 是static final,否则性能等同于反射。

有没有办法使用 LambdaMetaFactory 或 MutableCallSite 来提高性能?我看不到如何使用 LambdaMetaFactory(我们需要提前知道接口类型?),并且创建 MutableCallSite 仍然不是static final.

0 投票
1 回答
234 浏览

java - 如何使用 LambdaMetaFactory 在运行时创建代理对象?

如何使用 LambdaMetaFactory 为 SAM/功能接口创建代理对象

IE。相当于 public static Object java.lang.reflect.Proxy.newProxyInstance(ClassLoader, Class<?>[], InvocationHandler)

例如。我有多个工厂接口

我想在运行时生成与一些预构建的 bean 容器相关的工厂代理,例如

类似于

但建立在 LambdaMetaFactory 之上。我尝试了以下代码,但出现异常

提前致谢。