| 測試中需要用到的代碼 |
| InterfaceA代碼: package jichu; interface InterfaceA { String s1 = "this is s1 in InterfaceA"; public String method1(); } ClassA代碼: package jichu; public class ClassA { private String s1 = "this is s1 in ClassA"; private String s2 = "this is s2 in ClassA"; public String method1() { return "this is method1 in ClassA"; } public String method2() { return "this is method2 in ClassA"; } class Inner { private String s1 = "this is s1 in Inner"; private String method1() { return "this is method1 in Inner"; } } } ClassB代碼: package jichu; public class ClassB { } |
| Class類 |
| 位置:java.lang包中 |
| 聲明:public final class Class<T>implements java.io.Serializable, java.lang.reflect.GenericDeclaration,java.lang.reflect.Type,java.lang.reflect.AnnotatedElement class 類有final 修飾,可知他不能被子類繼承;並且它實現了多個接口。 |
| 類型參數:T - 由此 Class 對象建模的類的類型。例如,String.class 的類型是 Class<String>。如果將被建模的類未知,則使用 Class<?>。 |
| 介紹:Class是一個java中的泛型類型。Class 類的實例表示正在運行的 Java 應用程序中的類和接口。枚舉是一種類,注釋是一種接口。每個數組屬於被映射為 Class 對象的一個類,所有具有相同元素類型和維數的數組都共享該 Class 對象。基本的 Java 類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也表示為 Class 對象。 |
| 字段 |
private static final int ANNOTATION= 0x00002000; private static final int ENUM = 0x00004000; private static final int SYNTHETIC = 0x00001000; |
| 構造器 |
private Class() {}
構造器是私有的,可知不能通過new創建Class對象。 如何得到Class類的實例?
|
| getName方法 |
||||||||||||||||||||
| public String getName() |
||||||||||||||||||||
| 以 String 的形式返回此 Class 對象所表示的實體(類、接口、數組類、基本類型或 void)名稱。 如果此類對象表示一個基本類型或 void,則返回的名字是一個與該基本類型或 void 所對應的 Java 語言關鍵字相同的String。 如果此類對象表示一個數組類,則名字的內部形式為:表示該數組嵌套深度的一個或多個 '[' 字符加元素類型名。元素類型名的編碼如下:
|
| toString方法 |
| public String toString() |
| 重寫了Object類的toString方法。 public String toString() { return (isInterface() ? "interface " : (isPrimitive() ? "" : "class ")) + getName(); } 如果是接口,則返回"interface "+getName();否則如果是基本類型,則返回getName();否則返回"class "+getName()。 |
| 測試: Class c1 = ClassA.class; System.out.println(c1.toString());// class jichu.ClassA Class c2 = InterfaceA.class; System.out.println(c2.toString());// interface jichu.InterfaceA Class c3 = int.class; System.out.println(c3.toString());// int Class c4 = int[].class; System.out.println(c4.toString());// class [I Class c5 = void.class; System.out.println(c5.toString());// void Class c6 = (new ClassA().new Inner()).getClass(); System.out.println(c6.toString());// class jichu.ClassA$Inner |
| 獲取Class對象 |
|||||
|
|||||
|
|||||
|
|||||
|
| 判斷型方法 |
| public native boolean isInstance(Object obj); |
| 判定指定的 Object 是否與此 Class 所表示的對象賦值兼容。此方法是 Java 語言 instanceof 運算符的動態等效方法。 |
| public native boolean isArray(); |
| 判定此 Class 對象是否表示一個數組類。 |
| public native boolean isPrimitive(); |
| 判定指定的 Class 對象是否表示一個基本類型。 |
| public native boolean isInterface(); |
| 判定指定的 Class 對象是否表示一個接口類型。 |
| public boolean isMemberClass(); |
| 當且僅當底層類是成員類時返回 true。 |
| 測試: Class c1 = ClassA.class; System.out.println(c1.isInstance(new ClassA()));// true System.out.println(c1.isInstance(new ClassB()));// false Class c2 = InterfaceA.class; System.out.println(c2.isInterface());// true Class c3 = int.class; System.out.println(c3.isPrimitive());// true Class c4 = int[].class; System.out.println(c4.isArray());// true Class c5 = void.class; System.out.println(c5.isPrimitive());// true Class c6 = (new ClassA().new Inner()).getClass(); System.out.println(c6.isMemberClass());// true |
| 獲取類型信息 |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
| 創建實例 |
| public T newInstance() throws InstantiationException, IllegalAccessException |
| 創建此 Class 對象所表示的類的一個新實例。如同用一個帶有一個空參數列表的 new 表達式實例化該類。如果該類尚未初始化,則初始化這個類。 |
| 測試: Class c = Class.forName("jichu.ClassA");
ClassA o1 = (ClassA) c.newInstance();
ClassA o2 = (ClassA) c.newInstance();
System.out.println(o1.method1());// this is method1 in ClassA
System.out.println(o1 == o2);// false
|
