【简洁版:My类加载器】

来源:互联网 发布:音乐作曲软件 编辑:程序博客网 时间:2024/06/06 20:33

MyClassLoader.java

package com.xiaozhi.myclassloader;import java.io.ByteArrayOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;public class MyClassLoader extends ClassLoader{private String classDir;public MyClassLoader(){}public MyClassLoader(String classDir){this.classDir=classDir;}@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {String classFileName =classDir+"\\"+name.substring(name.lastIndexOf('.')+1)+".class";try {FileInputStream fileInputStream = new FileInputStream(classFileName);ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();int length = 0;byte [] bs = new byte[1024];while((length=fileInputStream.read(bs)) != -1){arrayOutputStream.write(bs,0,length);}fileInputStream.close();byte[] bytes = arrayOutputStream.toByteArray();return defineClass(bytes, 0, bytes.length);} catch (Exception e) {e.printStackTrace();}return super.findClass(name);}}
ClassLoaderAttachment.java

package com.xiaozhi.myclassloader;import java.util.Date;public class ClassLoaderAttachment extends Date{@Overridepublic String toString() {return "hello heima";}}  
Test.java

package com.xiaozhi.testmyclassloader;import java.util.Date;import com.xiaozhi.myclassloader.MyClassLoader;public class Test {public static void main(String[] args) throws Exception{Class clazz=new MyClassLoader("mylib").loadClass("com.xiaozhi.myclassloader.ClassLoaderAttachment");//ClassLoaderAttachment loaderAttachment= (ClassLoaderAttachment) clazz.newInstance();//这里不能这样写,因为ClassLoaderAttachment.class文件已经删除,编译器找不到Class文件。Date date=(Date) clazz.newInstance();System.out.println(date);}}

运行程序(这里用的是父类AppClassLoader类加载器加载的)

在项目下新建一个mylib包


找到ClassLoaderAttachment.class文件,将其剪贴到桌面上!



再次运行程序,报没有找到class文件异常


将桌面上的class文件复制到mylib目录下


再次运行程序(这里是使用自己的类加载器加载的)


0 0
原创粉丝点击