運行時類型識別(RTTI, Run-Time Type Identification)是java中非常有用的機制,在Java運行時,RTTI維護(hù)類的相關(guān)信息。
多態(tài)(polymorphism)是基于RTTI實現(xiàn)的。RTTI的功能主要是由Class類實現(xiàn)的。
publicfinal class Class<T> implements java.io.Serializable, GenericDeclaration, Type, AnnotatedElement {}
Class類是"類的類"(class of classes)。如果說類是對象的抽象和集合的話,那么Class類就是對類的抽象和集合。
每一個Class類的對象代表一個其他的類。比如下面的程序中,Class類的對象c1代表了Human類,c2代表了Woman類。
public class Test{ public static void main(String[] args) { Human aPerson = new Human(); Class c1 = aPerson.getClass(); System.out.PRintln(c1.getName());Human anotherPerson = new Woman(); Class c2 = anotherPerson.getClass(); System.out.println(c2.getName()); }}class Human{ /** * accessor */ public int getHeight() { return this.height; } /** * mutator */ public void growHeight(int h) { this.height = this.height + h; }private int height; }class Woman extends Human{ /** * new method */ public Human giveBirth() { System.out.println("Give birth"); return (new Human()); }}當(dāng)我們調(diào)用對象的getClass()方法時,就得到對應(yīng)Class對象的引用。
在c2中,即使我們將Women對象的引用向上轉(zhuǎn)換為Human對象的引用,對象所指向的Class類對象依然是Woman。
Java中每個對象都有相應(yīng)的Class類對象,因此,我們隨時能通過Class對象知道某個對象“真正”所屬的類。無論我們對引用進(jìn)行怎樣的類型轉(zhuǎn)換,對象本身所對應(yīng)的Class對象都是同一個。當(dāng)我們通過某個引用調(diào)用方法時,Java總能找到正確的Class類中所定義的方法,并執(zhí)行該Class類中的代碼。由于Class對象的存在,Java不會因為類型的向上轉(zhuǎn)換而迷失。這就是多態(tài)的原理。
除了getClass()方法外,我們還有其他方式調(diào)用Class類的對象。
public class Test{ public static void main(String[] args) { Class c3 = Class.forName("Human"); System.out.println(c1.getName()); Class c4 = Woman.class System.out.println(c2.getName()); }}上面顯示了兩種方式:
forName()方法接收一個字符串作為參數(shù),該字符串是類的名字。這將返回相應(yīng)的Class類對象。Woman.class方法是直接調(diào)用類的class成員。這將返回相應(yīng)的Class類對象。
Class類的方法
Class對象記錄了相應(yīng)類的信息,比如類的名字,類所在的包等等。我們可以調(diào)用相應(yīng)的方法,比如:
getName() 返回類的名字
getPackage() 返回類所在的包
可以利用Class對象的newInstance()方法來創(chuàng)建相應(yīng)類的對象,比如:
Human newPerson = c1.newInstance();newInstance()調(diào)用默認(rèn)的不含參數(shù)的構(gòu)建方法。
我們可以獲得類定義的成員:
getFields() 返回所有的public數(shù)據(jù)成員
getMethods() 返回所有的public方法
可以進(jìn)一步使用Reflection分析類。這里不再深入。
Class類更多的方法可查詢官方文檔:
http://docs.Oracle.com/javase/1.5.0/docs/api/java/lang/Class.html
Class類的加載
當(dāng)Java創(chuàng)建某個類的對象,比如Human類對象時,Java會檢查內(nèi)存中是否有相應(yīng)的Class對象。
如果內(nèi)存中沒有相應(yīng)的Class對象,那么Java會在.class文件中尋找Human類的定義,并加載Human類的Class對象。
在Class對象加載成功后,其他Human對象的創(chuàng)建和相關(guān)操作都將參照該Class對象。
出處:http://www.cnblogs.com/vamei 歡迎轉(zhuǎn)載
新聞熱點
疑難解答