【发布时间】:2018-06-13 15:08:29
【问题描述】:
Invoke private method with java.lang.invoke.MethodHandle 给出了私有成员访问的答案,而Java access bean methods with LambdaMetafactory 给出了基于 lambda 的成员访问的答案。但是,通过将两者结合起来,我仍然找不到通过 lambda 访问私有成员的方法。错误:
Caused by: java.lang.IllegalAccessException: member is private: XXX from ZZZ
at java.lang.invoke.MethodHandles$Lookup.revealDirect(MethodHandles.java:1353)
at java.lang.invoke.AbstractValidatingLambdaMetafactory.<init>(AbstractValidatingLambdaMetafactory.java:131)
at java.lang.invoke.InnerClassLambdaMetafactory.<init>(InnerClassLambdaMetafactory.java:155)
at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:299)
指向revealDirect,它是metafactory 呼叫站点构建器的一部分。如何自定义构建器以控制其访问检查?
更新:Working Solution Option #3 per Holger 的示例
【问题讨论】:
-
您应该提供引发异常的具体代码。一般来说,如果事实证明您可以自定义 lambda 行为的任何方面,我会感到惊讶。 lambda 语法的语义受 JLS 中的精确规范的约束。