class 類是在java語言中定義一個(gè)特定類的實(shí)現(xiàn)。一個(gè)類的定義包含成員變量,成員方法,還有這個(gè)類實(shí)現(xiàn)的接口,以及這個(gè)類的父類。class類的對象用于表示當(dāng)前運(yùn)行的 java 應(yīng)用程序中的類和接口。 比如:每個(gè)數(shù)組均屬于一個(gè) class 類對象,所有具有相同元素類型和維數(shù)的數(shù)組共享一個(gè)class 對象。基本的 java 類型(boolean, byte, char, short,int, long, float 和 double) 和 void 類型也可表示為 class 對象。
以下示例使用 class 對象顯示一個(gè)對象的 class 名:
1
2
|
void printclassname(object obj) { system.out.println( "the class of " + obj + " is " + obj.getclass().getname()); } |
我們都知道所有的java類都是繼承了object這個(gè)類,在object這個(gè)類中有一個(gè)方法:getclass().這個(gè)方法是用來取得該類已經(jīng)被實(shí)例化了的對象的該類的引用,這個(gè)引用指向的是class類的對象(呵呵,有點(diǎn)別扭)。我們自己無法生成一個(gè)class對象(構(gòu)造函數(shù)為private),而這個(gè)class類的對象是在當(dāng)各類被調(diào)入時(shí),由 java 虛擬機(jī)自動創(chuàng)建 class 對象,或通過類裝載器中的 defineclass 方法生成。 我們生成的對象都會有個(gè)字段記錄該對象所屬類在class類的對象的所在位置。如下圖所示:
我們可以把每個(gè)class類的對象當(dāng)做眾多類的代理。而且在每個(gè)class類對象中有會有字段記錄他引用的這個(gè)類的類加載器。如果該字段為null,表示該類的加載器為bootstrap loader.具體原因見我之前分享過的一篇“《classloader工作機(jī)制 》”一文。
我們知道java中有多個(gè)加載器,每個(gè)加載器能載入多個(gè)類,所以只要取得class類對象,就可利用其getclassloader()方法取得該類加載器的引用。
jvm為每種類管理者獨(dú)一的class對象。因此我們可以用雙等號操作符來比較對象:a1.getclass()==a.class;應(yīng)該返回的是true。
forname(string classname)和 forname(stringclassname,{*}boolean initialze,*classloader *loader)*方法。
該方法返回給定串名相應(yīng)的class對象。若給定一個(gè)類或接口的完整路徑名,那么此方法將試圖定位、裝載和連接該類。若成功,返回該類對象。否則,拋出classnotfoundexception異常。例如,下面代碼段返回名為java.lang.thread的運(yùn)行class描述器。classt=class.forname("java.lang.thread");此方法是需要指定類加載器的,當(dāng)用到僅有一個(gè)string參數(shù)的forname方法時(shí),class對象將默認(rèn)調(diào)用當(dāng)前類加載器作為加載器和將第二參數(shù)為true。第二個(gè)參數(shù)說明:如果是false時(shí),調(diào)用forname方法只是在命令類加載器載入該類,而不初始化該類的靜態(tài)區(qū)塊,只有當(dāng)該類第一次實(shí)例化時(shí),靜態(tài)區(qū)塊才被調(diào)用。當(dāng)為true時(shí),則載入時(shí)就調(diào)用靜態(tài)區(qū)塊。
getclassloader()
獲取該類的類裝載器。
getcomponenttype()
如果當(dāng)前類表示一個(gè)數(shù)組,則返回表示該數(shù)組組件的class對象,否則返回null。
getconstructor(class[])
返回當(dāng)前class對象表示的類的指定的公有構(gòu)造子對象。
getconstructors()
返回當(dāng)前class對象表示的類的所有公有構(gòu)造子對象數(shù)組。
getdeclaredconstructor(class[])
返回當(dāng)前class對象表示的類的指定已說明的一個(gè)構(gòu)造子對象。
getdeclaredconstructors()
返回當(dāng)前class對象表示的類的所有已說明的構(gòu)造子對象數(shù)組。
getdeclaredfield(string)
返回當(dāng)前class對象表示的類或接口的指定已說明的一個(gè)域?qū)ο蟆?/p>
getdeclaredfields()
返回當(dāng)前class對象表示的類或接口的所有已說明的域?qū)ο髷?shù)組。
getdeclaredmethod(string,class[])
返回當(dāng)前class對象表示的類或接口的指定已說明的一個(gè)方法對象。
getdeclaredmethods()
返回class對象表示的類或接口的所有已說明的方法數(shù)組。
getfield(string)
返回當(dāng)前class對象表示的類或接口的指定的公有成員域?qū)ο蟆?/p>
getfields()
返回當(dāng)前class對象表示的類或接口的所有可訪問的公有域?qū)ο髷?shù)組。
getinterfaces()
返回當(dāng)前對象表示的類或接口實(shí)現(xiàn)的接口。
getmethod(string,class[])
返回當(dāng)前class對象表示的類或接口的指定的公有成員方法對象。
getmethods()
返回當(dāng)前class對象表示的類或接口的所有公有成員方法對象數(shù)組,包括已聲明的和從父類繼承的方法。
getmodifiers()
返回該類或接口的java語言修改器代碼。
getname()
返回class對象表示的類型(類、接口、數(shù)組或基類型)的完整路徑名字符串。
getresource(string)
按指定名查找資源。
getresourceasstream(string)
用給定名查找資源。
getsigners()
獲取類標(biāo)記。
getsuperclass()
如果此對象表示除object外的任一類,那么返回此對象的父類對象。
isarray()
如果class對象表示一個(gè)數(shù)組則返回true,否則返回false。
isassignablefrom(class)
判定class對象表示的類或接口是否同參數(shù)指定的class表示的類或接口相同,或是其父類。
isinstance(object)
此方法是java語言instanceof操作的動態(tài)等價(jià)方法。
isinterface()
判定指定的class對象是否表示一個(gè)接口類型。
isprimitive()
判定指定的class對象是否表示一個(gè)java的基類型。
newinstance()
創(chuàng)建類的新實(shí)例。
tostring()
將對象轉(zhuǎn)換為字符串。
總結(jié)
以上就是本文關(guān)于淺談java中的class類的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
原文鏈接:http://www.cnblogs.com/yepei/p/5649276.html