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

重新定义非静态方法

卢翔宇
2023-03-14

我试图重新定义简单的非静态方法,但遇到了一个例外:

Exception in thread "main" java.lang.UnsupportedOperationException: class redefinition failed: attempted to change the schema (add/remove fields)

类别:

class Source { 
  def hello(name: String): String = "" 
}

class Target {
  def hello(name: String): String = "Hello" + name + "!"
}

电话:

 new ByteBuddy()
      .rebase(classOf[Source])
      .method(ElementMatchers.named("hello"))
      .intercept(MethodDelegation.to(new Target))
      .make()
      .load(classOf[Source].getClassLoader, ClassReloadingStrategy.fromInstalledAgent())
      .getLoaded
      .newInstance()
      .hello("World")

上面的类是scala类,但它们编译为标准的java类。

如何正确地重新定义方法?

共有2个答案

倪阳飇
2023-03-14

此github问题(https://github.com/raphw/byte-buddy/issues/14)似乎表明byte buddy不支持scala编译的类。

漆雕修德
2023-03-14

JVM目前不支持您尝试的内容,您无法从任何类中添加或删除字段或方法,这是重新基的隐含后果。

相反,您可以使用ByteBuddy重新定义一个类::重新定义。这样,Byte Buddy会替换原始实现,而不是保留它以供潜在调用。为了使此工作,您还需要委托给无状态(startic)方法,如下所示:

public class Target {
  public static String hello() {
    return "Hello" + name + "!"
  }
}

这是必要的,因为否则,Byte Buddy将需要向检测类添加一个字段来存储重新定义不可能实现的委托实例。

或者,看看Advice类,该类允许您在保留原始实现的情况下内联编码与重新分配兼容的内容。

 类似资料:
  • homebody能帮我提示一下如何使用byte buddy 1.6.9重新定义静态方法吗? 我试过这个: 我遇到以下异常: 线程“main”java.lang.IllegalStateException中的异常:无法注入已经加载的类型:类委托。来源 谢谢

  • 我的程序有问题。Eclipse写道: 我做错了什么?我的应用程序中有2个错误。班你能改进我的代码并解释一下吗?先谢谢你。 多边形 地聚线

  • 我试图理解重载和重写静态和非静态方法是如何工作的。事实上,我试图理解这些方法如何能够和不能出现在父类和子类中。我想出了下面的规则: 我们不能重写静态方法,只能隐藏它们。通过隐藏,我们的意思是在编译时根据引用变量类型决定执行哪个方法,而不是重写(,在运行时根据实例类型选择哪个方法执行)。 例如,让,然后隐藏. 我们可以重写实例方法。 例如重写. 两个或多个具有相同签名的方法不能以静态或非静态组合形式

  • PowerMockito.when(ConnectionFactory.getConn(“ABC”).getCurrentStatus()).thenReturn(ConnectionStatus.Connected); 对于上面的陈述,我得到了一个NPE。 我在junit测试类的开头已经有@PrepareForTest({fxallConnectionFactory.class,Connecti

  • 我最近对 PHP 5.4 进行了更新,但收到有关静态和非静态代码的错误。 这是错误: 这是第371行: 我希望有人能帮忙。

  • 问题内容: 到目前为止,我有以下代码: } 当我尝试在末尾设置double 时,出现错误消息“无法对非静态方法进行静态引用”。它说解决方法是也使该方法静态化,但是我的教授告诉我不要将该字段静态化。有一个简单的解决方案我只是想念吗? 问题答案: 静态方法属于该类,非静态方法属于该类的 实例 。 当您从呼叫时,您会收到错误消息,因为它与任何实例都没有关联。 您需要创建该类的实例: 然后,您可以调用实例