Java 反射:如何在运行时重写或生成方法?

2022-09-01 15:53:46

在纯Java中,是否可以在运行时以编程方式覆盖类的方法(甚至创建一个新方法)?

我希望能够做到这一点,即使我在编译时不知道这些类。

我所说的在运行时重写的确切含义:

abstract class MyClass{
  public void myMethod();
}

class Overrider extends MyClass{
  @Override
  public void myMethod(){}
}

class Injector{
  public static void myMethod(){ // STATIC !!!
    // do actual stuff
  }
}

// some magic code goes here
Overrider altered = doMagic(
    MyClass.class, Overrider.class, Injector.class);

现在,此调用...

altered.myMethod();

...将调用 Injector.myMethod() 而不是 Overrider.myMethod()。

Injector.myMethod() 是静态的,因为在执行“魔术”之后,它是从不同的类实例(它是 Overrider)调用的(所以我们阻止它访问本地字段)。


答案 1

您可以使用类似 cglib 的东西来动态生成代码


答案 2

在java6中,添加了转换任何已加载的类的可能性。看看 java.lang.instrument 包中的更改