【问题标题】:Changing the visibility of a method更改方法的可见性
【发布时间】: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


    【解决方案1】:

    重新定义方法的修饰符不适用于已加载的类。 JVM 拒绝任何添加/删除方法或更改任何方法属性的重新定义,例如它的修饰符。

    为了使方法公开,您需要应用变基而不是重新定义,在其中通过SuperMethodCall.INSTANCE 检测方法。需要在第一次加载相关类之前应用此转换。

    【讨论】:

      猜你喜欢
      • 2018-05-19
      • 2015-01-29
      • 2014-08-17
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      相关资源
      最近更新 更多