1反射的基石Class類 1.Java類用於描述一類事物的共性,該類事物有什麼屬性,沒有什麼屬性,至於這個屬性的值是什麼,則是由這個類的執行個體對象來確定的,不同的執行個體對象有不同的屬性值。Java程式中的各個Java類,它們是否屬於同一類事物,是不是可以用一個類來描述這類事物呢。這個類的名字就是Class,要注意與小寫class關鍵字的區別哦。Class類描述了哪些方面的資訊呢。類的名字,類的訪問屬性,類所屬於的包名,欄位名稱的列表、方法名稱的列表,等等。學習反射,首先就要明白Class這個類。寫如下代碼進行對比理解:
/*Person p1 = new Person("zhangsan");
Person p2 = new Person("lisi");
*/
/*Class x1 = Vector類在記憶體裡的位元組碼
Class x2 = Date類在記憶體裡的位元組碼*/
Class x1 = Vector.class;
Class x2 = Date.class;
每個java類都是Class的一個執行個體對象,它們的內容不同,但是,它們的特徵相同,譬如,都有方法,有欄位,有父類,有包。
2. ******講課時要一定畫一張圖:多個類的位元組碼裝載入記憶體,在記憶體中加入一個個方塊空間表示位元組碼,然後用一個個橢圓表示以這個位元組碼建立出來的執行個體對象,並用監視代碼來說明位元組碼只被裝載一次,而它構造的執行個體對象的構造方法被調用了多次。用如下代碼更進一步說明Class的執行個體是什麼。是一份位元組碼,一個類在虛擬機器中通常只有一份位元組碼:
Date d1 = new Date();
Class clazz1 = d1.getClass();
Class clazz2 = Date.class;
Class clazz3 = null;
clazz3 = Class.forName("java.util.Date");
Demo: view plain copy to clipboard print ? package cn.itcast; import java.util.Date; /** * 測試三個位元組碼是否為同一個位元組碼 * @author partner4java * */ public class ReflectTest1 { public static void main(String[] args) throws ClassNotFoundException { Date date = new Date(); Class date1 = date.getClass(); Class date2 = Class.forName("java.util.Date"); System.out.println("date1 == date2 ?" + (date1 == date2)); Class date3 = Date.class; System.out.println("date1 == date3 ?" + (date1 == date3)); // 後台列印: // date1 == date2 ?true // date1 == date3 ?true } }
Class JDK文檔:
public final class Class<T>extends Objectimplements Serializable, GenericDeclaration, Type, AnnotatedElementClass 類的執行個體表示正在啟動並執行 Java 應用程式中的類和介面。枚舉是一種類,注釋是一種介面。每個數組屬於被映射為 Class 對象的一個類,所有具有相同元素類型和維數的數組都共用該 Class 對象。基本的 Java 類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也表示為 Class 對象。
Class 沒有公用構造方法。Class 對象是在載入類時由 JAVA 虛擬機器以及通過調用類載入器中的 defineClass 方法自動構造的。
以下樣本使用 Class 對象來顯示對象的類名:
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
還可以使用一個類字面值(JLS Section 15.8.2)來獲得命名類型(或 void)的 Class 對象。例如:
System.out.println("The name of class Foo is: "+Foo.class.getName());
方法摘要
<U> Class<? extends U>
asSubclass(Class<U> clazz)
強制轉換該 Class 對象,以表示指定的 class 對象所表示的類的一個子類。
T cast(Object obj)
將一個對象強制轉換成此 Class 對象所表示的類或介面。
boolean desiredAssertionStatus()
如果要在調用此方法時,將要初始化該類,則返回將分配給該類的斷言狀態。
static Class<?> forName(String className)
返回與帶有給定字串名的類或介面相關聯的 Class 對象。
static Class<?> forName(String name, boolean initialize, ClassLoader loader)
使用給定的類載入器,返回與帶有給定字串名的類或介面相關聯的 Class 對象。
<A extends Annotation>
A
getAnnotation(Class<A> annotationClass)
如果存在該元素的指定類型的注釋,則返回這些注釋,否則返回 null。
Annotation[] getAnnotations()
返回此元素上存在的所有注釋。
String getCanonicalName()
返回《Java Language Specification》中所定義的基礎類的正常化名稱。
Class[] getClasses()
返回一個包含某些 Class 對象的數組,這些對象表示屬於此 Class 對象所表示的類的成員的所有公用類和介面,包括從超類和公用類繼承的以及通過該類聲明的公用類和介面成員。
ClassLoader getClassLoader()
返回該類的類載入器。
Class<?> getComponentType()
返回表示數組組件類型的 Class。
Constructor<T> getConstructor(Class... parameterTypes)
返回一個 Constructor 對象,它反映此 Class 對象所表示的類的指定公用構造方法。
Constructor[] getConstructors()
返回一個包含某些 Constructor 對象的數組,這些對象反映此 Class 對象所表示的類的所有公用構造方法。
Annotation[] getDeclaredAnnotations()
返回直接存在於此元素上的所有注釋。
Class[] getDeclaredClasses()
返回 Class 對象的一個數組,這些對象反映聲明為此 Class 對象所表示的類的成員的所有類和介面,包括該類所聲明的公用、保護、預設(包)訪問及私人類和介面,但不包括繼承的類和介面。
Constructor<T> getDeclaredConstructor(Class... parameterTypes)
返回一個 Constructor 對象,該對象反映此 Class 對象所表示的類或介面的指定構造方法。
Constructor[] getDeclaredConstructors()
返回 Constructor 對象的一個數組,這些對象反映此 Class 對象表示的類聲明的所有構造方法。
Field getDeclaredField(String name)
返回一個 Field 對象,該對象反映此 Class 對象所表示的類或介面的指定已聲明欄位。
Field[] getDeclaredFields()
返回 Field 對象的一個數組,這些對象反映此 Class 對象所表示的類或介面所聲明的所有欄位,包括公用、保護、預設(包)訪問和私人欄位,但不包括繼承的欄位。
Method getDeclaredMethod(String name, Class... parameterTypes)
返回一個 Method 對象,該對象反映此 Class 對象所表示的類或介面的指定已聲明方法。
Method[] getDeclaredMethods()
返回 Method 對象的一個數組,這些對象反映此 Class 對象表示的類或介面聲明的所有方法,包括公用、保護、預設(包)訪問和私人方法,但不包括繼承的方法。
Class<?> getDeclaringClass()
如果此 Class 對象所表示的類或介面是另一個類的成員,則返回的 Class 對象表示該對象的聲明類。
Class<?> getEnclosingClass()
返回基礎類的立即封閉類。
Constructor<?> getEnclosingConstructor()
如果該 Class 對象表示構造方法中的一個本地或匿名類,則返回 Constructor 對象,它表示基礎類的立即封閉構造方法。
Method getEnclosingMethod()
如果此 Class 對象表示某一方法中的一個本地或匿名類,則返回 Method 對象,它表示基礎類的立即封閉方法。
T[] getEnumConstants()
如果此 Class 對象不表示枚舉類型,則返回枚舉類的元素或 null。
Field getField(String name)
返回一個 Field 對象,它反映此 Class 對象所表示的類或介面的指定公用成員欄位。
Field[] getFields()
返回一個包含某些 Field 對象的數組,這些對象反映此 Class 對象所表示的類或介面的所有可訪問公用欄位。
Type[] getGenericInterfaces()
返回表示某些介面的 Type,這些介面由此對象所表示的類或介面直接實現。
Type getGenericSuperclass()
返回表示此 Class 所表示的實體(類、介面、基本類型或 void)的直接超類的 Type。
Class[] getInterfaces()
確定此對象所表示的類或介面實現的介面。
Method getMethod(String name, Class... parameterTypes)
返回一個 Method 對象,它反映此 Class 對象所表示的類或介面的指定公用成員方法。
Method[] getMethods()
返回一個包含某些 Method 對象的數組,這些對象反映此 Class 對象所表示的類或介面(包括那些由該類或介面聲明的以及從超類和超介面繼承的那些的類或介面)的公用 member 方法。
int getModifiers()
返回此類或介面以整數編碼的 Java 語言修飾符。
String getName()
以 String 的形式返回此 Class 對象所表示的實體(類、介面、數組類、基本類型或 void)名稱。
Package getPackage()
擷取此類的包。
ProtectionDomain getProtectionDomain()
返回該類的 ProtectionDomain。
URL getResource(String name)
尋找帶有給定名稱的資源。
InputStream getResourceAsStream(String name)
尋找具有給定名稱的資源。
Object[] getSigners()
擷取此類的標記。
String getSimpleName()
返回原始碼中給出的基礎類的簡稱。
Class<? super T> getSuperclass()
返回表示此 Class 所表示的實體(類、介面、基本類型或 void)的超類的 Class。
TypeVariable<Class<T>>[] getTypeParameters()
按聲明順序返回 TypeVariable 對象的一個數組,這些對象表示用此 GenericDeclaration 對象所表示的常規聲明來聲明的類型變數。
boolean isAnnotation()
如果此 Class 對象表示一個注釋類型則返回 true。
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
如果指定類型的注釋存在於此元素上,則返回 true,否則返回 false。
boolean isAnonymousClass()
若且唯若基礎類是匿名類時返回 true。
boolean isArray()
判定此 Class 對象是否表示一個數組類。
boolean isAssignableFrom(Class<?> cls)
判定此 Class 對象所表示的類或介面與指定的 Class 參數所表示的類或介面是否相同,或是否是其超類或超介面。
boolean isEnum()
若且唯若該類聲明為原始碼中的枚舉時返回 true。
boolean isInstance(Object obj)
判定指定的 Object 是否與此 Class 所表示的對象賦值相容。
boolean isInterface()
判定指定的 Class 對象是否表示一個介面。
boolean isLocalClass()
若且唯若基礎類是本地類時返回 true。
boolean isMemberClass()
若且唯若基礎類是成員類時返回 true。
boolean isPrimitive()
判定指定的 Class 對象是否表示一個基本類型。
boolean isSynthetic()
如果此類是複合類,則返回 true,否則 false。
T newInstance()
建立此 Class 對象所表示的類的一個新執行個體。
String toString()
將對象轉換為字串。
Constructor<T> JDK文檔:
public final class Constructor<T>extends AccessibleObjectimplements GenericDeclaration, MemberConstructor 提供關於類的單個構造方法的資訊以及對它的存取權限。
4Field類 view plain copy to clipboard print ? Field類代表某個類中的一個成員變數 ReflectPoint point = new ReflectPoint(1,7); Field y = Class.forName("cn.itcast.corejava.ReflectPoint").getField("y"); System.out.println(y.get(point)); //Field x = Class.forName("cn.itcast.corejava.ReflectPoint").getField("x"); Field x = Class.forName("cn.itcast.corejava.ReflectPoint").getDeclaredField("x"); x.setAccessible(true);