如何实现 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

阅读 1k
评论 2018-07-25 提问
    3 个回答

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

    评论 赞赏 2018-07-26
      阿菜
      • 236

      可以在Class.forName外包一层。

      void loadClass(String name){
          if("xxx".equals(name)){
              name = "newName";
          }
          Class.forName(name);
      }
      评论 赞赏 2018-08-09

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

        评论 赞赏 2018-07-25
          撰写回答

          登录后参与交流、获取后续更新提醒