iva*_*off 25 java reflection code-generation runtime
在普通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);
Run Code Online (Sandbox Code Playgroud)
现在,这个调用......
altered.myMethod();
Run Code Online (Sandbox Code Playgroud)
...将调用Injector.myMethod()而不是Overrider.myMethod().
Injector.myMethod()是静态的,因为在执行"magic"之后,它会从不同的类实例(它是Overrider)调用,(因此我们阻止它访问本地字段).
对于接口有java.lang.reflect.Proxy.
对于课程,您需要第三方库或编写相当多的代码.通常以这种方式动态创建类是为了测试创建模拟.
还有一个允许修改类的instrumentation API.您还可以使用自定义类加载器或仅使用磁盘上的类文件来修改类.