package com.study.ming.classloader;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class MyClassLoader3 extends ClassLoader{
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
byte[] result = getClassFromCustomPath(name);
if (result == null) {
throw new FileNotFoundException(name);
} else {
// defineClass方法将字节码转化为类
System.out.println(name);
return defineClass(name, result, 0, result.length);
}
} catch (Exception e) {
e.printStackTrace();
}
throw new ClassNotFoundException(name);
}
private byte[] getClassFromCustomPath(String name) {
// 从自定义路径中加载指定类,返回类的字节码文件
InputStream in = null;
ByteArrayOutputStream out = null;
String path = "d:\\JavaEngineer.class";
try {
in = new FileInputStream(path);
out = new ByteArrayOutputStream();
byte[] buffer = new byte[2048];
int len = 0;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
return out.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
@Test
public void sdfdef() {
try{
MyClassLoader3 mcl = new MyClassLoader3();
Class<?> clazz = Class.forName("com.study.ming.model.JavaEngineer", true, mcl);
System.out.println(clazz.getClassLoader());//打印出我们的自定义类加载器
Object obj = clazz.newInstance();
System.out.println(obj);
System.out.println(obj.getClass().getClassLoader());//打印出我们的自定义类加载器
}catch(Exception e){
}
}
public static void main(String[] args) {
try{
MyClassLoader3 mcl = new MyClassLoader3();
Class<?> clazz = Class.forName("com.study.ming.model.JavaEngineer", true, mcl);
System.out.println(clazz.getClassLoader());//打印出我们的自定义类加载器
Object obj = clazz.newInstance();
System.out.println(obj);
System.out.println(obj.getClass().getClassLoader());//打印出我们的自定义类加载器
}catch(Exception e){
}
}
}
最近在研究类加载器方面的问题,自己照网络上资料写了一个自定义类加载器,但是同样的代码我运行main方法 结果 与 运行Junit方法不一样
我是在项目路径 d://xxx/com/study/ming/model 目录下执行javac JavaEngineer.java生成class文件拷贝到d盘目录, 代码中路径直接写死在d盘了 传到自定义类加载器中的
main方法结果:
com.study.ming.model.JavaEngineer
com.study.ming.classloader.MyClassLoader3@7a07c5b4
JavaEngineer{jeid=0, jename='null'}
com.study.ming.classloader.MyClassLoader3@7a07c5b4
junit方法结果:
sun.misc.Launcher$AppClassLoader@18b4aac2
JavaEngineer{jeid=0, jename='null'}
sun.misc.Launcher$AppClassLoader@18b4aac2
package com.study.ming.model;
import java.text.CollationKey;
import java.text.Collator;
public class JavaEngineer implements Comparable<JavaEngineer>{
private int jeid;
private String jename;
public JavaEngineer(int jeid, String jename) {
this.jeid = jeid;
this.jename = jename;
}
public JavaEngineer() {
}
@Override
public int compareTo(JavaEngineer o) {
int a = this.jeid-o.getJeid();
if(a!=0){
return a;
}else{
final CollationKey collationKey = Collator.getInstance().getCollationKey(this.jename);
final CollationKey collationKey1 = Collator.getInstance().getCollationKey(o.getJename());
return collationKey.compareTo(collationKey1);
}
}
public int getJeid() {
return jeid;
}
public void setJeid(int jeid) {
this.jeid = jeid;
}
public String getJename() {
return jename;
}
public void setJename(String jename) {
this.jename = jename;
}
@Override
public String toString() {
return "JavaEngineer{" +
"jeid=" + jeid +
", jename='" + jename + '\'' +
'}';
}
}
是不是junit方法运行之前干了一些事呢?