Java classload理解記錄

       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();

}

}

}

相關文章
相關標籤/搜索