天天看點

java動态加載類 更新_Java-如何動态的更新已經加載的類

class Test{

void loadClass(String path) throws Exception {

//new A();eclipse報錯,找不到這個類

String className = "A";

File file = new File(path);

URLClassLoader fscl = new URLClassLoader(new URL[] { file.toURI().toURL() });

Class> class1 = fscl.loadClass(className);

System.out.println(class1.hashCode());

Object obj1 = class1.newInstance();

Method method1 = class1.getMethod("say1", new Class[] {});

method1.invoke(obj1, new Object[] {});

}

loadClass("D:\work\projects\");

//修改A.java檔案,并編譯生成class檔案

//注意A.class不能和目前類在同一個classpath中,或者說目前類的classloader或其父classloader中沒有加載A.class。JVM根據類的全名和加載此類的類加載器是否一樣來判斷兩個類是否相同,隻有兩者都相同的情況,才認為兩個類是相同的。

loadClass("D:\work\projects\");

}

}

如果類A和類B被加載同一個classloader加載,類A想重新加載類B,是不可行的(個人認為)。

我上面的例子中Test類是在D:workspacesrc中,在運作時環境中,沒有類A,Test的classloader和加載A的是不同的,這一點很重要。