一说动态加载类,大家都会想到classloader。可是做了这个测试,突然对于动态加载迷惑了。public class Test  {
public void doit() throws FileNotFoundException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class c = ClassLoader.getSystemClassLoader().loadClass("Test1");
Method method = c.getMethod("tt");

Class[] paramTypes = { Date.class};
Object[] params = {new Date()}; 
Constructor con = c.getConstructor(paramTypes);   

Boolean b = (Boolean) method.invoke(con.newInstance(params));
}
public static void main(String[] args) throws FileNotFoundException, SecurityException, IllegalArgumentException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException  {

Test t = new Test();
t.doit();
t.doit();
}
}
public class Test1 {
        public Test1(Date d) {
        }
public void tt() {

System.out.println("aa");
// System.out.println("bb");
try {
Thread.sleep(1000 * 20 );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}执行Test类的时候,调用第一次Test1的方法的时候打印aa,然后我更改类Test1的打印内容为bb,保存。这时候调用第二次Test1的方法的时候,依旧打印的是aa,而不是更改后的bb。这说明jvm在load类的时候,应该是有个判断,存在的class不重新加载,那么应该如何实现这个类的刷新呢?

解决方案 »

  1.   

    ClassLoader在加载的时候会先到缓存(Repository)中查看,如果没有,则请求父ClassLoader加载
      

  2.   

    你要动态加载的类不能放在系统 classpath 上,否则依据委托原则,必定会被系统 classloader 加载。不能委托加载的类才能用自定义类加载器加载到。我原来作过一个动态热部署的例子:简单例子演示如何进行类的热加载(Hot Deployment)里面也讲了类加载的几个原则,JVM 专题里几篇东西也一定对您会有所帮助。有什么疑问或宝贵意见,欢迎留言共同探讨。