【发布时间】:2016-12-02 21:42:52
【问题描述】:
是否可以(仅)使用 Byte Buddy 更改某些方法的可见性?我有一个带有私有静态方法的用户类,我需要将一些调用委托给这些方法,但它目前失败了,因为它们是私有的。所以,我想知道我是否可以通过添加公共修饰符来转换上述方法来重新定义用户类。
作为记录,在目标 Java 方法上调用 setAccessible(true) 方法无效,因为 Byte Buddy 仍然失败,并出现以下异常:
java.lang.IllegalStateException: class net.bytebuddy.renamed.java.lang.Object$ByteBuddy$VHdvjIkb cannot see private java.lang.String org.mockaccino.MockaccinoTest.lambda$3() throws java.lang.Exception
at net.bytebuddy.implementation.MethodCall$MethodInvoker$ForContextualInvocation.invoke(MethodCall.java:2387)
...
我发现了一些 API 可以解决问题,但我需要检测方法,这在我的情况下不需要。
例如:
byteBuddy.redefine(targetClass)
.method(ElementMatchers.named(targetMethod.getName()))
.intercept(???)
.transform(Transformer.ForMethod.withModifiers(Visibility.PUBLIC))
.make()
.load(getClassLoader(), ClassReloadingStrategy.fromInstalledAgent());
我的问题是:是否有一个拦截器能够调用正在重新定义的源方法的主体?
或者是否有其他方法可以使目标方法公开可见?
【问题讨论】:
标签: java byte-buddy