问题描述
我正在使用JDK15。(我正在使用ByteBuddy 1.10.16生成一些类,但我认为除背景信息外,它在这里几乎无关紧要。)
在这些生成的类之一中,我正在设法存储在生成的类中的invokeExact()
常数上调用MethodHandle
。这是通过MethodHandles.Lookup#findSetter
获取的“字段设置器”。
(在接下来的工作中,我知道了MethodHandles.privateLookupIn()
方法。)
我注意到有问题的“字段设置器” MethodHandle
代表private
字段时失败。在大多数情况下,这并不令我感到惊讶:直接MethodHandle
是直接的:虽然我并不假装对所有这些东西的内在知识都了解很多,但在我看来,肯定它必须包裹一些东西没有访问检查的低级字节码。
但是考虑到privateLookupIn()
的存在,这表明在某些情况下可以绕过访问检查,有没有一种方法可以使我从A类“收获”一个“字段设置器” MethodHandle
读取一个private
字段,然后将其作为常量存储在另一个类B中,以便其上的invokeExact()
成功吗?
我相信我过去曾经做过类似的事情(必须检查),涉及private
方法,但是在那种情况下,我不是{em>不是使用MethodHandle
constants ,即我在MethodHandle
期间的类初始化时间使用<clinit>
获取了privateLookupIn()
,并将得到的MethodHandle
存储在private static final
字段中,然后在该字段的内容上调用invokeExact()
。如果我必须继续走这条路,我会这样做,但是MethodHandle
常数似乎很吸引人,如果可以的话,最好使用它们。
因此,表达我的问题的另一种方式是:表示MethodHandle
的常量形式是否能够存储其特权?还是有一种一次性的方式“提升”给定存储为常量的MethodHandle
的特权?还是将给定的MethodHandle
存储为常量这一事实是否会阻止它始终访问除常规可访问的Java构造以外的任何东西? I didn't see anything super obvious in the JVM specification in the relevant section.
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)