昨天写了ClassLoader原理的东西,今天对ClassLaoder做了一下测试
package com.fnk.classloader;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import com.fnk.TestClass;
public class MultyClassLoader {
public static void main(String[] args) {
FileClassLoader classLoader1 = new FileClassLoader(
"./");
FileClassLoader classLoader2 = new FileClassLoader(
"./");
try {
/*
*在同一个类加载器中加载了类com.fnk.classloader.TestClass和com.fnk.TestClass。虽然类名
*相同,但是不同的包下面所以可以加载。但如果加载同包同类名就会抛出重复加载的错误。
*/
Class c1 = classLoader1.loadClass("com.fnk.classloader.TestClass");
classLoader1.setDirectory("./src/");
Class c11 = classLoader1.findClass("com.fnk.TestClass");
/*
* TestClass是定义在class path下面的类,虽然类名也是com.fnk.TestClass。但是因为TestClass是App classloader
* 加载的,而c11是classLoader1加载的。这样将c11实例化的对象的引用赋值给TestClass时就抛出ClassCastException异常
*/
TestClass tc = (TestClass)c11.newInstance();
tc.test();
/*
* 不同的classLoader中可以加载同包同类名的类。而且会被认为是不同的类。
* 如下面当我调用tc1.equals(tc2)时返回了false,如下我重载了equals方法。
* public boolean equals(Object obj) {
* // TODO Auto-generated method stub
* if(obj instanceof TestClass)
* return true;
* else
* return super.equals(obj);
* }
* 我们可以让TestClass类实现Testf接口,那样就将TestClass对象赋值给Testf接口,然后调用方法
*/
Class c2 = classLoader2.loadClass("com.fnk.classloader.TestClass");
Testf tc1 = (Testf)c1.newInstance();
Testf tc2 = (Testf)c2.newInstance();
tc1.test();
tc2.test();
if(tc1.equals(tc2)){
System.out.println("true");
}else{
System.out.println("false");
}
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}