是否可以使用MethodHandle常量来绕过访问控制?

问题描述

我正在使用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 (将#修改为@)