Java 自定义ClassLoader

来源:互联网 发布:mac装双系统 编辑:程序博客网 时间:2024/06/06 20:47

废话不多说,按步骤来,直接代码

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;}@Overrideprotected 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@12edcd21MyPrint...







原创粉丝点击