Java中Class類的深入理解和作用

class與Class的區別

很多初學者不知道這兩者,其實它們並沒有關聯class 是描述類的一個關鍵字Class 是保存著運行時信息的類

Class能夠做什麼?

Class類可以幫助我們在程序運行時分析類,也就是就是獲取類中的值。可能瞬間就想到了反射,確實,Class一般就是和反射配套使用的,因為我們向Class提供一個類或一個類的類名,Class就可以提供我們很多信息,比如屬性/方法/修飾符/構造器/類名等等。然後我們就可以進一步進行反射。

public static void main(String[] args) throws Exception {
// 以String.class為例
String str = new String();
Class cl = str.getClass();
/**
 * 獲取包名+類名
* java.lang.String */ cl.getName(); /** * 只獲取類名 - String */ cl.getSimpleName(); /** * 獲取數組的Class對象
* 因為所有的Java類都繼承自Object,數組也一樣.所以數組本身也是個Class, 得到數組的Class自然也可以轉回數組. */ cl.getComponentType(); /** * 返回構造器數組,包括超類的公有成員. */ cl.getConstructors(); /** * 返回方法數組,包括超類的公有成員. */ cl.getMethods(); /** * 返回域數組,包括超類的公有成員. */ cl.getFields(); /** * 返回全部構造器數組,無論是public/private還是protected,不包括超類的成員. */ cl.getDeclaredConstructors(); /** * 返回全部域數組,無論是public/private還是protected,不包括超類的成員. */ cl.getDeclaredFields(); /** * 返回全部方法數組,無論是public/private還是protected,不包括超類的成員. */ cl.getDeclaredMethods(); /** * 獲取類前的修飾符 */ cl.getModifiers(); }

我們可以通過一個類來獲取Class對象,進而獲取此類的信息。也可以通過全類名來獲取Class對象。

`String str = (String)(Class.forName("java.lang.String").newInstance());

以下是用Constructor通過獲取構造器來創建對象:

// 調用無參的私有構造函數
 Constructor c1 = Class.forName("java.lang.String")
 .getDeclaredConstructor();
 c1.setAccessible(true);
 String str1 = (String) c1.newInstance();
 // 調用有參的私有構造函數
 Constructor c2 = Class.forName("java.lang.String")
 .getDeclaredConstructor(new Class[] { String.class });
 c2.setAccessible(true);
 String str2 = (String) c2.newInstance("hello");

Class其實就是個信息類,在運行時跟蹤類,掌握類的全部信息。

資源共享:黑馬程序員Java教學視頻以及資料包

私信回覆:Java

(注意英文大小寫要一致哦)


分享到:


相關文章: