一说动态加载类,大家都会想到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不重新加载,那么应该如何实现这个类的刷新呢?
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不重新加载,那么应该如何实现这个类的刷新呢?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货