java class 是否相等_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
helloClazz:class com.test.javatechnology.classloader.test.Hello
false
false
總結
以上是生活随笔為你收集整理的java class 是否相等_Java重要技术(30)类加载器之Class类型的相等比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 数据库字段_JAVA如何获得数
- 下一篇: java中递归的概念_【Java】基础3