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...
阅读全文
0 0
- java 自定义ClassLoader
- 自定义 Java ClassLoader
- Java 自定义ClassLoader
- java自定义ClassLoader实例代码
- 自定义classloader加密java程序
- 自定义classloader加密java程序
- Java高级进阶:自定义ClassLoader
- Java基础(十四) ---- classLoader详细解释及自定义classLoader
- 自定义classloader实现JAVA热替换
- java自定义classloader引发的思考
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- Unity 中的4X4矩阵
- 一、排序之冒泡排序
- 吉他各种调式推算
- [leetcode]#83. Remove Duplicates from Sorted List
- Word开发中的常用接口,Range,Tables,InlineShapes
- Java 自定义ClassLoader
- mybatis调用 存储过程方法简单demo
- NFS 文件共享
- 关于hibernate中对象的三种状态分析
- 解决并发问题
- 百度地图使用模拟器报错java.lang.IllegalArgumentException: No config chosen
- centos 配置
- 7基于opencv的形态学处理(二)开运算_闭运算_形态学梯度_顶帽_黑帽合辑
- 欧式距离 与 内积 与 范数