您的位置:首页 > 编程语言 > Java开发

Java 自定义ClassLoader

2017-11-17 14:43 344 查看
废话不多说,按步骤来,直接代码

1.建一个接口文件,代码如下:

package Test;
public interface PrintIntf {
void print();
}


2.自定义一个ClassLoader,代码如下:

package Test;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;

public class NetworkClassLoader extends ClassLoader{
private String rootUrl;
public NetworkClassLoader(String rootUrl){
this.rootUrl = rootUrl;
}
private String classNameToPath(String name){
return this.rootUrl+"/"+name.replace('.', '/')+".class";
}
private byte[] getClassData(String name){
InputStream iStream = null;
try{
String path = classNameToPath(name);
URL url = new URL(path);
byte[] buff = new byte[1024*4];
int len = -1;
iStream = url.openStream();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
while((len=iStream.read(buff))!=-1){
stream.write(buff,0,len);
}
return stream.toByteArray();
}catch (Exception e) {
e.printStackTrace();
}finally {
if(iStream!=null){
try{
iStream.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
return null;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class<?> clazz = null;
byte[] classData = getClassData(name);
if(classData == null){
throw new ClassNotFoundException();
}
clazz = defineClass(name, classData, 0, classData.length);
return clazz;
}
}


3.建一个要加载的Java文件,生成class文件,并将其移到D盘的Test目录下,代码如下:

package Test;

public class MyPrint implements PrintIntf{
public void print() {
System.out.println("MyPrint...");
}
}


4.实现动态加载,调用代码如下:

package Test;

public class MyTest2 {
public static boolean IsClassExist(String className) {
try {
Class<?> clazz = Class.forName(className);
System.out.println(clazz.getName());
return true;
} catch (Exception e) {
return false;
}
}

public static void main(String[] args) {
if (!IsClassExist("Test.MyPrint")) {
try {
String rootUrl = "file:/D:";
NetworkClassLoader classLoader = new NetworkClassLoader(rootUrl);
String className = "Test.MyPrint";
Class<?> clazz = classLoader.loadClass(className);
System.out.println(clazz.getClassLoader());
PrintIntf pIntf = (PrintIntf)clazz.newInstance();
pIntf.print();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

成功输出如下:

Test.NetworkClassLoader@12edcd21
MyPrint...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  class java classloader