Java ClassLoad做用只是把Java class文件加載到內存中。須要你本身去把內存中的字節碼去初始化你爲你的對象。html
這裏有個blog :http://my.oschina.net/u/1412027/blog/186920 Class.forName和ClassLoader.loadClass區別 講的很是清楚。java
引用「 forName("")獲得的class是已經初始化完成的
loadClass("")獲得的class是尚未鏈接的」數據庫
還有數據庫的驅動加載的玩法,頗有意思。apache
這個Blog http://www.blogjava.net/vincent/archive/2008/08/30/225804.html 「經過ClassLoader說明容器熱部署實現機制」 講到了 classloader的雙親委派機制,以及判斷一個類是不是重複加載須要判斷,是不是同一段字節碼和同一個類加載器。等特性 很不錯。函數
我在製做networkClassLoader的測試環境時,Eclipse能夠導出的jar須要解壓,而後放到如apache的htdocs下面去,能夠理解爲是拼URL地址來找到單個文件的。第一次玩這個須要注意下。測試
若是要定義ClassLoader字須要是實現findclass函數便可。
url
參考:http://blog.csdn.net/xyang81/article/details/7292380spa
向以上blog的做者道一聲謝謝。.net
來段測試代碼:orm
public static void main(String args[]) throws ClassNotFoundException,
InstantiationException, IllegalAccessException,
MalformedURLException {
String rootUrl = "http://127.0.0.1/classes/";
String className = "com.jcloud.test.classload.NetClassLoaderSimple";
URL[] urlarr = new URL[1];
urlarr[0] = new URL(rootUrl);
NetClassLoaderMain NetClassLoaderMain1 = new NetClassLoaderMain(urlarr);
NetClassLoaderMain NetClassLoaderMain2 = new NetClassLoaderMain(urlarr);
//只是字節碼
Class<?> clazz1 = NetClassLoaderMain1.loadClass(className);
Class<?> clazz2 = NetClassLoaderMain2.loadClass(className);
//須要本身實例化
Object obj1 = clazz1.newInstance();
Object obj2 = clazz2.newInstance();
System.out.println(obj1);
System.out.println(obj2);
// ((com.jcloud.test.NetClassLoaderSimple)obj1).setNetClassLoaderSimple(obj2);
try {
clazz1.getMethod("setNetClassLoaderSimple", Object.class).invoke(obj1,
obj2);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
-------------這段代碼測試不解壓jar包---
作法是:
一、把URLClassLoader中的addURL方法設置爲可訪問。
二、調用addURL把jar包放到Classloader加載列表中。
三、加載對應的class。
package com.jcloud.test.classload.jar;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class ClassLoaderJarTest {
public static Method initAddMethod() {
try {
Method add = URLClassLoader.class.getDeclaredMethod("addURL",
new Class[] { URL.class });
//原來的addURL方法爲protected
add.setAccessible(true);
return add;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static Method addURL = null;
public static URLClassLoader classloader = null;
public static void main(String[] args) {
/*
* 系統加載jar
*/
try {
// 系統ClassLoader只能加載.jar
// 動態加載jar
addURL = initAddMethod();
classloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
System.out.println(classloader);
File jarFile = new File("C:\\xampp\\htdocs\\classes\\test.jar");
URL classUrl = jarFile.toURI().toURL();
System.out.println(classUrl);
addURL.invoke(classloader, new Object[] { classUrl });
String className = "com.jcloud.test.classload.NetClassLoaderSimple";
Class<?> c = classloader.loadClass(className);
// Class<?> c = Class.forName(className);
Object obj = c.newInstance();
Object obj2 = c.newInstance();
// 被調用函數的參數
System.out.println("obj=" +obj);
System.out.println("obj2=" + obj2);
// 之定義的方法setNetClassLoaderSimple
Method method2 = c.getDeclaredMethod("setNetClassLoaderSimple",
Object.class);
method2.invoke(obj, obj2);
} catch (Exception exp) {
exp.printStackTrace();
}
}
}