Java 自定义ClassLoader
2017-11-17 14:43
344 查看
废话不多说,按步骤来,直接代码
1.建一个接口文件,代码如下:
2.自定义一个ClassLoader,代码如下:
3.建一个要加载的Java文件,生成class文件,并将其移到D盘的Test目录下,代码如下:
4.实现动态加载,调用代码如下:
成功输出如下:
Test.NetworkClassLoader@12edcd21
MyPrint...
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...
相关文章推荐
- java 代码自己实现自定义的Classloader
- Java Class的热替换 自定义ClassLoader加载.class(java热部署实现 )
- Java加密部署,使用自定义的classloader解密的方法实例
- ClassLoader的双亲代理机制和能否自定义一个java.lang.String类
- Java Class的热替换 自定义ClassLoader加载.class
- Java Class的热替换 自定义ClassLoader加载.class
- 自定义 Java ClassLoader
- Java Class的热替换 自定义ClassLoader加载.class(java热部署实现 )
- Java 自定义ClassLoader
- Java基础(十四) ---- classLoader详细解释及自定义classLoader
- Java_ClassLoader(ClassLoader / 自定义ClassLoader / DexClassLoader)
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
- Spring 整合hibernante 错误java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
- java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList
- java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList
- Java ClassLoader基础及加载不同依赖 Jar 中的公共类
- 深入分析Java ClassLoader原理
- Java 反射中,class.forName()和classLoader的区别
- 深入分析Java ClassLoader原理
- Java ClassLoader机制分析 -- Tomcat commloader 例说