java动态加载class的几种方法

Life is short , play more!
本文来自lihao's Blog,转载请注明。

有时候我们需要在java里动态load class文件,比如load的文件不在工程内,也没有在classpath的环境变量里(见第四种方法)。 根据网上的资料,归纳一下几种动态加载class的方法。

{
String testlibstring="com.whoistester.lib.TestLib";

String Classroot="c:/TestLib.class";

/**
* 1。first method to load class 前提:该class文件在本工程中
*/

Object a = Class.forName(testlibstring).newInstance();  //  注意testlibstring包含 包名+类名哦!!

Method method = a.getClass().getMethod("hello");

method.invoke(a);

/**
* 2。second method to load class 前提:该class文件在本工程中
*/
ClassLoader loader = ClassLoader.getSystemClassLoader();
System.out.println(loader);

Class testlibclass = loader.loadClass(testlibstring); //  注意testlibstring包含 包名+类名哦!!

Object newinstance = testlibclass.newInstance();

method = newinstance.getClass().getMethod("hello");

method.invoke(newinstance);

/**
*
* 3。third method to load class and execute method 前提:该class文件在本工程中
*
*/

ClassLoader loader3 = Test.class.getClassLoader();

System.out.println(loader3);

Class testlibclass3 = loader3.loadClass(testlibstring); //  注意testlibstring包含 包名+类名哦!!

Object newinstance3 = testlibclass3.newInstance();

method = newinstance3.getClass().getMethod("hello");

method.invoke(newinstance3);

/**
*
* 4。fourth method to load class and execute method 前提:该class文件在任何其他位置,但该方法需要自行定义classloader (这里的自己定义的loader为MyClassLoader)
*
*
**/

ClassLoader loader4 = Test.class.getClassLoader();

MyClassLoader myloader = new MyClassLoader(loader4);

Class myownclassloadded = myloader.loadClass("TestLib");

//System.out.println("===========================");

Object newinstance4 = myownclassloadded.newInstance();

Method method4 = newinstance4.getClass().getMethod("hello");

method4.invoke(newinstance4);

}

 

下面是myclassloader的代码:

package com.whoistester;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

 

public class MyClassLoader extends ClassLoader{

public MyClassLoader(ClassLoader parent) {
super(parent);
}

public Class loadClass(String name) throws ClassNotFoundException {

if(!"TestLib".equals(name))
return super.loadClass(name);

System.out.println(name);
try {
String url = "file:D:/research/load generator development/testlib/TestLib.class";
URL myUrl = new URL(url);
URLConnection connection = myUrl.openConnection();
InputStream input = connection.getInputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int data = input.read();

while(data != -1){
buffer.write(data);
data = input.read();
}

input.close();

byte[] classData = buffer.toByteArray();
//System.out.println("++++++++++++++++++"+classData.length);

return defineClass("TestLib",
classData, 0, classData.length);

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return null;
}
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注