【问题标题】:How to reload a class using Java UrlClassLoader如何使用 Java UrlClassLoader 重新加载类
【发布时间】:2014-06-22 12:31:24
【问题描述】:

我有一个在程序执行期间需要多次使用的类列表,我需要动态加载它们,因为它们的代码可能会经常更改,我想将它们视为服务,以便我可以更新它们容易地。这是我的问题:

即使没有更改,UrlClassLoader 是否总是再次加载该类? 这会导致性能或内存问题吗?

这是我的测试代码:

package classloader;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

public class ClassLoaderClass {
    public static void main(String[] args) throws ClassNotFoundException, MalformedURLException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, InterruptedException {

            //no paramater
            Class noparams[] = {};

        URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{new URL("file:///C:/Users/hm/Documents/classes/")});
        Class gsonClass = urlClassLoader.loadClass("AppTest");
        Constructor constructor = gsonClass.getConstructor();
        Object Apptest = constructor.newInstance();
        Method method = gsonClass.getMethod("printIt",noparams);
        Object returnObj =  method.invoke(Apptest, null);
        String jsonString = (String)returnObj;
}

}

希望你能帮助我,谢谢。

【问题讨论】:

  • 您是否考虑过使用 OSGi,它对加载/停止“捆绑”具有相当强大的支持,允许代码在运行时更改?
  • 这似乎很有用,但我有一个非常复杂的应用程序,我正在寻找可以添加到我的应用程序中以使其与某些类作为服务一起使用的东西。在我看来,对于使用 OSGI,我必须再次对我的所有应用程序进行编程,我不希望这样,如果我错了,请纠正我

标签: java reflection urlclassloader


【解决方案1】:

URLClassLoader 检查一个类是否已经被加载并且不会再次加载它。详情请见ClassLoader.loadClass()

【讨论】:

  • 所以这意味着如果我在加载类后更改代码,这些更改不会被加载?如果是这样,我如何才能仅在某些内容发生更改时重新加载该类?
  • @Hira 你必须重新定义你的课程,但我不知道如何访问ClassLoader.defineClass()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 2011-06-07
相关资源
最近更新 更多