一 生成Class對象的三種方式
1 Class.forName("全路徑名")
2 類名.Class
3 實例對象.getClass()
接着看三種方式生成Class對象的區別
package com.shangcg.reflect; /** * * <p> * 三種方式生成Class對象的區別測試 * 說明:測試一、二、三可屏蔽代碼分開進行看輸出結果 * </p> */
public class ClassDemo { public static void main(String[] args) { try { /* * 測試一 測試類名.class * 輸出為: * testTypeClass---class com.shangcg.reflect.AnyOneObject 沒有執行構造函數沒有執行靜態塊 */ Class<?> testTypeClass = AnyOneObject.class; System.out.println("testTypeClass---" + testTypeClass); /*測試二 測試Class.forName() * 輸出為: ---靜態的參數初始化--- 說明執行靜態塊 testForName---class com.shangcg.reflect.AnyOneObject */ Class<?> anyOneTypeForName = Class.forName("com.shangcg.reflect.AnyOneObject"); System.out.println("testForName---" + anyOneTypeForName); /* 測試三 測試Object.getClass() * 輸出: * ---靜態的參數初始化--- 執行靜態塊 ----非靜態的參數初始化--- 執行非靜態塊初始化 ----構造函數--- 執行構造函數 testGetClass---class com.shangcg.reflect.AnyOneObject */ AnyOneObject testGetClass = new AnyOneObject(); System.out.println("testGetClass---" + testGetClass.getClass()); } catch (Exception e) { e.printStackTrace(); } } } class AnyOneObject { //構造函數
public AnyOneObject() { System.out.println("----構造函數---"); } //靜態的參數初始化
static { System.out.println("---靜態的參數初始化---"); } //非靜態的參數初始化
{ System.out.println("----非靜態的參數初始化---"); } }
結論:
1 類名.class(也稱類字面常量) 方式生成Class對象不會初始化的靜態塊,不會初始化參數,不會調用構造函數
2 Class.forName()方式生成Class對象會初始化類靜態塊,但不會初始化非靜態的代碼塊,也不調用構造函數
3 Object.getClass()方式生成Class對象會先初始化靜態塊,接着執行非靜態塊的初始化,最后調用構造函數
二 java反射(介紹Class類中方法之前,先介紹一下反射)
1 Java反射機制主要功能:
1.在運行時判斷任意一個對象所屬的類。
2.在運行時構造任意一個類的對象。
3.在運行時判斷任意一個類所具有的成員變量和方法。
4.在運行時調用任意一個對象的方法。
2 對反射提供支持的類(反射功能主要由Class對象和java.lang.relflect包中的類提供支持)
Class類:代表一個類,位於java.lang包下。
Field類:代表類的成員變量(成員變量也稱為類的屬性)。
Method類:代表類的方法。
Constructor類:代表類的構造方法。
Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法。
三 Class常用方法解釋
Class就是普通的一個類,和我們平時寫的類沒有什么區別,它位於java.lang包下,和java.lang.reflect包下的類共同支持了java的整個反射功能
常用方法列表
1getName():返回String形式的該類的名稱。
2 newInstance():根據某個Class對象產生其對應類的實例,它調用的是此類的默認構造方法(沒有默認無參構造器會報錯)
3 getClassLoader():返回該Class對象對應的類的類加載器。
4 getSuperClass():返回某子類所對應的直接父類所對應的Class對象
5 isArray():判定此Class對象所對應的是否是一個數組對象
6 getComponentType() :如果當前類表示一個數組,則返回表示該數組組件的 Class 對象,否則返回 null。
7 getConstructor(Class[]) :返回當前 Class 對象表示的類的指定的公有構造子對象。
8 getConstructors() :返回當前 Class 對象表示的類的所有公有構造子對象數組。
9 getDeclaredConstructor(Class[]) :返回當前 Class 對象表示的類的指定已說明的一個構造子對象。
10 getDeclaredConstructors() :返回當前 Class 對象表示的類的所有已說明的構造子對象數組。
11 getDeclaredField(String) :返回當前 Class 對象表示的類或接口的指定已說明的一個域對象。
12 getDeclaredFields() :返回當前 Class 對象表示的類或接口的所有已說明的域對象數組。
13 getDeclaredMethod(String, Class[]) :返回當前 Class 對象表示的類或接口的指定已說明的一個方法對象。
14 getDeclaredMethods() :返回 Class 對象表示的類或接口的所有已說明的方法數組。
15 getField(String) :返回當前 Class 對象表示的類或接口的指定的公有成員域對象。
16 getFields() :返回當前 Class 對象表示的類或接口的所有可訪問的公有域對象數組。
17 getInterfaces() :返回當前對象表示的類或接口實現的接口。
18 getMethod(String, Class[]) :返回當前 Class 對象表示的類或接口的指定的公有成員方法對象。
19 getMethods() :返回當前 Class 對象表示的類或接口的所有公有成員方法對象數組,包括已聲明的和從父類繼承的方法。
20 isInstance(Object) :此方法是 Java 語言 instanceof 操作的動態等價方法。
21 isInterface() :判定指定的 Class 對象是否表示一個接口類型
22 isPrimitive() :判定指定的 Class 對象是否表示一個 Java 的基類型。
23 newInstance() :創建類的新實例
參考文章http://www.cnblogs.com/mengdd/archive/2013/01/26/2877972.html
http://blog.csdn.net/ghuilee/article/details/45821537
