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
包中,如果您将 --release
与 javac
一起使用则无法导出,我就是。
无论如何,我想到 ByteBuddy 可能有一些用于 performing the same kind of unchecked bytecode work that MethodAccessorGenerator
does 的工具。
如何使用 ByteBuddy 实现此目的?
这是不可能的,因为您不能在字节码中合法地表达它。我还建议不要使用魔术访问器,因为这在未来的 Java 版本中不再有效,而使用 MethodHandle
s 解决了这个问题。您可以解析方法句柄并从生成的 class.
中调用它
我正在调用 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
包中,如果您将 --release
与 javac
一起使用则无法导出,我就是。
无论如何,我想到 ByteBuddy 可能有一些用于 performing the same kind of unchecked bytecode work that MethodAccessorGenerator
does 的工具。
如何使用 ByteBuddy 实现此目的?
这是不可能的,因为您不能在字节码中合法地表达它。我还建议不要使用魔术访问器,因为这在未来的 Java 版本中不再有效,而使用 MethodHandle
s 解决了这个问题。您可以解析方法句柄并从生成的 class.