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;
}
@Override
protected 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{
@Override
public 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目录下
再次运行程序(这里是使用自己的类加载器加载的)