java 对比类_Java重要技术(30)类加载器之Class类型的相等比较

1.1. class类的相等比较

对于class类的对象,只有由相同的类加载器加载,并且类名相同,才是相同的class。

同时,对于类的委托加载机制,可以遵循,也可以不遵循。

定义Hello类。

packagecom.test.javatechnology.classloader.test;//位于test目录中。

public classHello {

}

定义类加载器。

/*** @Title: SpecialClassLoader.java

* @Package com.test.javatechnology.classloader

* @Description:

*@author http://www.cnblogs.com/coe2coe/* @date 2017年4月5日 下午10:07:53

*@versionV1.0*/

packagecom.test.javatechnology.classloader;importjava.io.IOException;importjava.io.InputStream;/*** @ClassName: SpecialClassLoader

* @Description:

*@author http://www.cnblogs.com/coe2coe/* @date 2017年4月5日 下午10:07:53

**/

public class SpecialClassLoader extendsClassLoader {//彻底改变加载类的方式,可以不遵循类的委托加载机制。

@Overridepublic Class> loadClass(String name) throwsClassNotFoundException {

System.out.println("loadClass:" +name);//Object类由系统自行加载。

if("java.lang.Object".equals(name)){return super.loadClass(name);

}//特殊加载方式。

returnspecialLoadClass(name);

}/*** 加载test目录下的class文件。

*@paramname

*@return

*/

private Class> specialLoadClass(String name) throwsClassNotFoundException {

Class>clazz;

String fullname= "test/" + name+".class";

System.out.println("specialLoadClass:"+fullname);

clazz= this.loadClassFromFile(fullname);

System.out.println("---resolveClass--");super.resolveClass(clazz);returnclazz;

}/*** 从文件名加载class文件。

*@paramname class文件名

*@return*@throwsClassNotFoundException*/

private Class> loadClassFromFile(String name) throwsClassNotFoundException{

InputStream is= null;

Class clazz= null;byte[] bytes = null;try{//读取class文件的内容。

is= SpecialClassLoader.class.getResourceAsStream(name);int size =is.available();

bytes= new byte[size];

is.read(bytes);//定义类。

clazz= super.defineClass(bytes, 0, size);

}catch(Exception e){

e.printStackTrace();throw newClassNotFoundException(name);

}finally{if(is!=null){try{

is.close();

is= null;

}catch(IOException e) {

e.printStackTrace();

}

}if(bytes!=null){

bytes= null;

}

}returnclazz;

}

}

编写测试代码。

public static voidmain(String[] args) {

Class clazz= null;

ClassLoader classLoader;try{

classLoader= newSpecialClassLoader ();

clazz= classLoader.loadClass("Hello");

System.out.println(clazz);

System.out.println(clazz.getClassLoader());

}catch(ClassNotFoundException e) {

e.printStackTrace();

}

Class helloClazz;

helloClazz= Hello.class;

System.out.println("helloClazz:" +helloClazz);

System.out.println(helloClazz.getClassLoader());

System.out.println(helloClazz==clazz);

System.out.println(helloClazz.equals(clazz));

}

运行结果:

loadClass:Hello

specialLoadClass:test/Hello.class

loadClass:java.lang.Object

---resolveClass--

class com.test.javatechnology.classloader.test.Hello

com.test.javatechnology.classloader.SpecialClassLoader@106d69c

helloClazz:class com.test.javatechnology.classloader.test.Hello

sun.misc.Launcher$AppClassLoader@e2f2a

false

false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值