当前位置: 首页 > 知识库问答 >
问题:

更改方法的可见性

邵伟泽
2023-03-14

是否可以(仅仅)使用Byte-Buddy更改某些方法的可见性?我有一个带有私有静态方法的用户类,我需要将一些调用委托给这些方法,但由于它们是私有的,所以当前失败了。因此,我想知道是否可以通过添加公共修饰符来转换上述方法来重新定义user类。

对于记录,在目标Java方法上调用setAccessible(true)方法作为not effect,因为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());

我的问题是:是否有一个拦截器能够调用正在重新定义的源方法的主体?

或者是否有其他方法可以使目标方法公开可见?

共有1个答案

蓬长恨
2023-03-14

重新定义方法的修饰符对加载的类不起作用。JVM拒绝任何添加/删除方法或更改任何方法属性(例如其修饰符)的重新定义。

为了使方法公开,您需要应用重新分配,而不是通过超级方法调用(SuperMethodCall)对方法进行重新定义。实例。这种转换需要在第一次加载所讨论的类之前应用。

 类似资料:
  • 我是Netbeans和Java的新手,对jpanels上的jlabel有一个问题。我有一个jTabbedPane,里面有一个jPanel。我在JPanel上有一个jLabel。我想将jLabel的可见性设置为false,但似乎不起作用。当我运行程序时,标签仍然可见。我不明白为什么。

  • 我得到了一个适配器,其中包含2和2。开始时,EditTexts是可见的,而Textviews则消失了。如果我点击一个按钮,如果在1个(或两者)EditText中写的是好答案,则专用EditText被设置为gone,而Textview(显示答案)现在被设置为visible。问题是这些可见性更改没有保存,当我退出并回到这个Viewpager时,Textviews没有了,EditText也可见了,就好像

  • 带有母版页的项目C# 我想以编程方式更改 中 的可见性(True/False)。 母版页 master_page C# 问题是如何通过LI对象的ID调用它来改变它的可见性 匿名用户 使用 ,然后可以执行。 注意,这会将它在浏览器中获得的更改为生成(派生)id值。有解决此问题的方法,例如,请参见此处:如何在使用母版页的ASP.NET Web窗体中为服务器控件设置特定ID?

  • 改变接收到的message的不可见时间 message被某一用户实例接收后,将在一段时间内变为不可见,以防止被反复接收 当不可见时间超时,且之间一直没有收到此message的删除请求,EMQ将认为这条message未被成功处理,且此次接收message的用户实例已变为不响应状态。因此EMQ会将message重新置为可见状态,以便此message被再次读取并成功处理 用户实例接收后message后,

  • 我正在开发一个带有谷歌云endpoint的Android应用程序,我已经读了很多关于它的文档和教程,但仍然缺少一个信息:我如何选择哪些后端的方法将是Android客户端可见的? 假设我有一个FriendshipEndpoint,FriendshipEndpoint有这个方法: 编辑FriendshipEndpoint使用注释进行注释 这种方法应该只在后端可见(而不是通过Android客户端)。 我

  • 我正在尝试使用LayoutTransition动画,但它们不起作用。 我设置 在我的activity布局中的父级LinearLayout中。然后,在选中或未选中另一个复选框时,对包含一些复选框的子LinearLayout执行setVisibility(View.Visible)或setVisibility(View.Gone)。可见性更改不是动画的。父级LinearLayout中有一个Scroll