setAccessible(true) 的 ByteBuddy 等价物是什么?

What is the ByteBuddy equivalent of setAccessible(true)?

我正在调用 MethodCall.invoke 并试图在一个对象上调用一个不可访问的方法(该方法声明为包私有)。

如果我使用反射,我可以做 theMethod.setAccessible(true) 然后访问检查将被禁用。

作为黑客,我知道 MethodDescription 继承自 ByteCodeElement which defines isAccessibleTo(TypeDescription). I overrode that to return true just to see what would happen. Unsurprisingly, I get an IllegalAccessError at method invocation time. This also happens if I override isVisibleTo(TypeDescription)

我知道 setAccessible(true) 的魔力部分是由 subclassing MagicAccessorImpl 实现的。我也知道这是在默认情况下不导出的 jdk.internal.reflect 包中,如果您将 --releasejavac 一起使用则无法导出,我就是。

无论如何,我想到 ByteBuddy 可能有一些用于 performing the same kind of unchecked bytecode work that MethodAccessorGenerator does 的工具。

如何使用 ByteBuddy 实现此目的?

这是不可能的,因为您不能在字节码中合法地表达它。我还建议不要使用魔术访问器,因为这在未来的 Java 版本中不再有效,而使用 MethodHandles 解决了这个问题。您可以解析方法句柄并从生成的 class.

中调用它