问题标签 [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 投票
1 回答
479 浏览

java - Java lambda 元工厂

我收到此异常 java.lang.invoke.LambdaConversionException: Incorrect number of parameters for instance method invokeVirtual call:()void; 0个捕获参数,0个功能接口方法参数,0个实现参数

0 投票
1 回答
328 浏览

java - 从 LambdaMetafactory 创建 BiConsumer

我正在尝试通过 LambdaMetafactory 动态创建 BiConsumer 类型的方法引用。我试图应用在https://www.cuba-platform.com/blog/think-twice-before-using-reflection/上找到的两种方法 - createVoidHandlerLambda 和这里Create BiConsumer as Field setter 没有反映Holger 的答案。

但是,在这两种情况下,我都有以下错误:

我的代码是这样的:

MyClass 看起来像这样:

我将感谢您对此的帮助。

编辑#1。在咨询@Holger 之后,我将 createSetter 方法修改为:

现在这个方法不会抛出初始异常,尽管在这个方法引用上调用 accept 似乎没有效果。我在此调用的日志中没有看到“Called setValid”。仅适用于 MyClass::setValid;

0 投票
0 回答
72 浏览

java - 使用 LambdaMetafactory 线程进行动态方法调用是否安全?

我正在使用 Java 反射在运行时动态调用方法。但我建议不要使用它,因为它不是线程安全的。所以我搜索了反射的替代方案,并找到了这个 LambdaMetaFactory实现。我想知道它是否是线程安全的或不继续进行。

0 投票
0 回答
98 浏览

java - 使用 LambdaMetaFactory 暴露 getter 导致类转换异常

我正在使用 LambdaMetaFactory 来公开 getter。我有一个包含许多字段的 POJO,但我不知道要填充哪些字段。我试图避免扩展 if 语句和反射。

所以这是我 POJO 的一个片段:

这是我从所有 getter 中获取我的值的方法:

问题是这里的这一行:

产生 Unchecked Class Cast 警告。我知道我们应该避免这些。这段代码工作得很好。我不确定如何更改它以避免类强制转换异常。CallSite 不接受参数。

0 投票
2 回答
176 浏览

java - 是否有一种快速的反射字段访问方法?

我需要一种方法来访问具有反射性质的字段,而不会影响标准反射的性能。我已经想出了如何使用特权查找句柄通过 LambdaMetaFactory 使用方法/构造函数来做到这一点,但是,我似乎无法弄清楚如何获得字段访问权限。

我以为我可以通过 javaassist 之类的东西生成一个内部类,理论上它应该可以访问该字段,但没有成功,抛出 IllegalAccessError。

如果我可以重新定义类,那么任务将是微不足道的,因为我可以生成 getter/setter 方法。但是,对于我正在处理的项目,我无法使用代理,因为它需要在运行时加载,并且我必须从工具中动态导入附加 api。

有人可以在这里指导我正确的方向吗?我研究了 LambdaMetaFactory 如何为方法生成它的接口,并试图用没有成功的字段来镜像它。字段和方法的内部是否存在一些不同之处,使得如果不重新定义就无法完成这项任务?

0 投票
1 回答
140 浏览

java - 将方法从文件转换为 LambdaExpression

我正在尝试将方法(从文件中读取)转换为 lambda 表达式,因此我可以测量执行该方法所需的时间,而忽略慢速 Method.invoke(...) 函数。

我一直在尝试使用 实现我的目标LambdaMetafactory,但老实说,我已经阅读了很多关于如何做到这一点的问题和解释,以至于我什至不知道我在做什么了。

假设参数和方法构造良好并且(这是棘手的部分)我必须动态处理涉及不同数量和类型参数的多个选项:

以及界面(对不起名称,我稍后会更改它):

这是尝试使用 lambda 执行该方法的代码:

我读过这篇文章,我不明白我在做什么好和错。你能帮我吗?

[编辑] 当前错误是:

0 投票
2 回答
66 浏览

java - LambdaMetaFactory 装箱/拆箱参数和返回类型

我有以下两种方法:

包括以下两个接口:

这适用于所有类类型,包括用于原始类型的数字包装器,例如Integerfor int。但是,如果我有一个接受 an 的 setterint或一个返回 an 的 getter ìnt,它会尝试传递/返回 Number-Wrapper,从而导致异常。

无需使用其他方法即可将其装箱/拆箱的正确方法是什么。这里的原因是保持 API 干净且易于使用。我愿意为这里的拳击/拆箱带来小小的性能损失。

0 投票
1 回答
104 浏览

java - LambdaMetaFactory 和私有方法

我想使用 LambdaMetaFactory 来有效地访问私有方法。

我知道这不是安全违规,因为以下代码有效:

但是,我尝试使用 LambdaMetaFactory 失败了:

显然m.setAccessible(true)这里还不够。我尝试更改lookupMethodHandles.privateLookupIn(Foo.class, MethodHandles.lookup()),这在我的玩具示例中确实解决了它......但在我的实际应用程序中没有,它会生成一个IllegalAccessException说法,我的班级“没有完全特权访问”。我一直无法发现为什么我的应用程序“没有完全权限访问”,或者如何修复它。

我发现几乎可以工作的唯一一件事是:

只要我在VM选项中有我可以做到TRUSTED的,它就允许我使用它。这会产生一个代替(说它找不到),这似乎很有希望......但我仍然无法弄清楚如何让它完全工作,只是产生这个错误而不是其他错误。lookup--illegal-access=permitNoClassDefFoundErrorFoo

这里发生了什么,我该如何bar访问LambdaMetaFactory

0 投票
1 回答
69 浏览

groovy - 应该如何使用 LambdaMetafactory 生成调用动态调用站点

我正在尝试研究如何使用 LambdaMetafactory 生成可用的 callSite。

这是我最新的 Groovy 脚本尝试。我尝试了多种参数排列,但无法使第二个基于 getter 的示例正常工作。

我做的第一个例子最终开始工作,从一个闭包中生成一个供应商,经过大量的摆弄和阅读 Java 文档和 Stack Overflow。

当您运行此程序时,第一个示例有效,我可以获得有效的 callSite 以从 Closure 获取动态供应商引用。第二个示例采用相同的方法,但使用带有 getter 方法的标准类。

我尝试了许多类型的排列,methodTypes 的参数数量都没有效果。

鉴于我想生成有效的 invokeDynamic 引用,我必须做什么才能生成可行的代码?