加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何在java中运行的应用程序中替换类?

发布时间:2020-12-14 05:38:54 所属栏目:Java 来源:网络整理
导读:说我有一个名为NameGenerator的类.我可以使用它来根据给定的逻辑生成名称.然后我用一个方法来编写一个TestNameGeneration类,该方法要求用户输入一个字母,并根据该名称生成一个名称.现在我想更改NameGeneration类中的逻辑,并应用该特定的更改而不停止应用程序
说我有一个名为NameGenerator的类.我可以使用它来根据给定的逻辑生成名称.然后我用一个方法来编写一个TestNameGeneration类,该方法要求用户输入一个字母,并根据该名称生成一个名称.现在我想更改NameGeneration类中的逻辑,并应用该特定的更改而不停止应用程序.

我这样做是为了更多的了解类加载器,有人可以解释我必须学习的关键概念,以便做这样的或网站的任何参考?

解决方法

这是一个工作测试.每5秒Test.main()从文件系统重新加载test.Test1.class并调用Test1.hello()
package test;

public class Test1 {
    public void hello() {
        System.out.println("Hello !");
    }
}

public class Test {

    static class TestClassLoader extends ClassLoader {
        @Override
        public Class<?> loadClass(String name) throws ClassNotFoundException {
            if (name.equals("test.Test1")) {
                try {
                    InputStream is = Test.class.getClassLoader().getResourceAsStream("test/Test1.class");
                    byte[] buf = new byte[10000];
                    int len = is.read(buf);
                    return defineClass(name,buf,len);
                } catch (IOException e) {
                    throw new ClassNotFoundException("",e);
                }
            }
            return getParent().loadClass(name);
        }
    }

    public static void main(String[] args) throws Exception {
        for (;;) {
            Class cls = new TestClassLoader().loadClass("test.Test1");
            Object obj = cls.newInstance();
            cls.getMethod("hello").invoke(obj);
            Thread.sleep(5000);
        }
    }
}

运行.然后更改并重新编译Test1

System.out.println("Hello !!!");

而测试正在运行.您将看到Test1.hello输出更改

...
Hello !
Hello !
Hello !!!
Hello !!!

这就是Tomcat如何重新加载webapps.它为每个webapp都有一个单独的ClassLoader,并在新的ClassLoader中加载一个新版本.旧的是GCed就像任何Java对象以及旧类一样.

请注意,我们使用TestClassLoader加载Test1,并通过反射调用其第一个方法.但是所有Test1依赖项将被隐式加载Test1类加载器,即所有Test1应用程序将被JVM加载到TestClassLoader中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读