如何实现 Java 替换 或 热替换 rt.jar 里的 一个方法?

public class Main{
    public staic void main(String[] args){
        System.out.println(Class.forName("a.b.old.C"));
    }
}

由于某些特殊需求,需要 把 Class.forName 改掉,当使用该方法时,如果传入的类的包名包含某一段路径,就替换成另外一段路径。比如 Class.forName("a.b.old.XXX") 获取到的类将是 "a.b.new.XXX"。

请教一下,如何才能实现上诉效果,且不能修改rt.jar

阅读 5.2k
3 个回答

不要使用class.forname,使用自定义的类加载器

可以在Class.forName外包一层。

void loadClass(String name){
    if("xxx".equals(name)){
        name = "newName";
    }
    Class.forName(name);
}

首先不能把rt.jar放在java_home里,rt.jar不能动就动环境变量java_home,这样bootstrap classloader就找不到rt.jar了,然后注册一个自定义的classloader来加载java_home里的所有jar包,顺便在rt.jar里动点手脚

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题