java动态加载class的几种方法
Posted On 2011年12月29日
有时候我们需要在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;
}
}
此篇文章已被阅读3328 次