重新定义非静态方法

时间:2017-09-20 09:30:37

标签: java scala byte-buddy

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

$in

类:

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 + "!"
}

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

如何正确重新定义方法?

2 个答案:

答案 0 :(得分:1)

JVM目前不支持您尝试的内容,您无法在任何类中添加或删除字段或方法,这是重新定义的一个重要后果。

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

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

代表团:MethodDelegation.to(Target.class)。这是必要的,因为否则,Byte Buddy需要在已检测的类中添加一个字段来存储委托实例,而重新定义是不可能的。

或者,查看Advice类,它允许您内联代码与保留原始实现的rebasement兼容的内容。

答案 1 :(得分:-1)

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