java.lang包—类Class
原文作者:一人淺醉-
原文地址:Java中的Class類
目錄
生成Class對象的三種方式
Class常用方法解釋
總結(jié)
Class 類是在Java語言中定義一個特定類的實現(xiàn)。一個類的定義包含成員變量,成員方法,還有這個類實現(xiàn)的接口,以及這個類的父類。Class類的對象用于表示當(dāng)前運行的 Java 應(yīng)用程序中的類和接口。 比如:每個數(shù)組均屬于一個 Class 類對象,所有具有相同元素類型和維數(shù)的數(shù)組共享一個Class 對象。基本的 Java 類型(boolean, byte, char, short,int, long, float 和 double) 和 void 類型也可表示為 Class 對象。以下示例使用 Class 對象顯示一個對象的 Class 名:
void printClassName(Object obj) { System.out.println("The class of " + obj + " is " + obj.getClass().getName()); }我們都知道所有的java類都是繼承了object這個類,在object這個類中有一個方法:getclass().這個方法是用來取得該類已經(jīng)被實例化了的對象的該類的引用,這個引用指向的是Class類的對象(呵呵,有點別扭)。我們自己無法生成一個Class對象(構(gòu)造函數(shù)為private),而這個Class類的對象是在當(dāng)各類被調(diào)入時,由 Java 虛擬機自動創(chuàng)建 Class 對象,或通過類裝載器中的 defineClass 方法生成。 我們生成的對象都會有個字段記錄該對象所屬類在CLass類的對象的所在位置。如下圖所示:
我們可以把每個Class類的對象當(dāng)做眾多類的代理。而且在每個Class類對象中有會有字段記錄他引用的這個類的類加載器。如果該字段為null,表示該類的加載器為bootstrap loader.具體原因見我之前分享過的一篇“《ClassLoader工作機制 》”一文。
我們知道java中有多個加載器,每個加載器能載入多個類,所以只要取得Class類對象,就可利用其getClassLoader()方法取得該類加載器的引用。jvm為每種類管理者獨一的Class對象。因此我們可以用雙等號操作符來比較對象:a1.getClass()==A.class;應(yīng)該返回的是true。
生成Class對象的三種方式
- 類名.Class:也稱類字面常量,生成Class對象不會初始化的靜態(tài)塊,不會調(diào)用構(gòu)造函數(shù),不會初始化參數(shù)
- Class.forName("全路徑名"):生成Class對象會初始化類靜態(tài)塊,但不會初始化非靜態(tài)的代碼塊,也不調(diào)用構(gòu)造函數(shù)
- 實例對象.getClass():生成Class對象會先初始化靜態(tài)塊,接著執(zhí)行非靜態(tài)塊的初始化,最后調(diào)用構(gòu)造函數(shù)
接著看三種方式生成Class對象的區(qū)別
package com.shangcg.reflect; /** 三種方式生成Class對象的區(qū)別測試* 說明:測試一、二、三可屏蔽代碼分開進行看輸出結(jié)果*/ public class ClassDemo {public static void main(String[] args){try {/* * 測試一 測試類名.class * 輸出為:testTypeClass---class com.shangcg.reflect.AnyOneObject 說明沒有執(zhí)行構(gòu)造函數(shù)沒有執(zhí)行靜態(tài)塊*/Class<?> testTypeClass = AnyOneObject.class;System.out.println("testTypeClass---" + testTypeClass);/*測試二 測試Class.forName() * 輸出為:---靜態(tài)的參數(shù)初始化--- 說明執(zhí)行靜態(tài)塊testForName---class com.shangcg.reflect.AnyOneObject */Class<?> anyOneTypeForName = Class.forName("com.shangcg.reflect.AnyOneObject");System.out.println("testForName---" + anyOneTypeForName);/* 測試三 測試Object.getClass()* 輸出:* ---靜態(tài)的參數(shù)初始化--- 執(zhí)行靜態(tài)塊----非靜態(tài)的參數(shù)初始化--- 執(zhí)行非靜態(tài)塊初始化----構(gòu)造函數(shù)--- 執(zhí)行構(gòu)造函數(shù)testGetClass---class com.shangcg.reflect.AnyOneObject*/AnyOneObject testGetClass = new AnyOneObject();System.out.println("testGetClass---" + testGetClass.getClass());} catch (Exception e) {e.printStackTrace();}} }class AnyOneObject {//構(gòu)造函數(shù) public AnyOneObject() {System.out.println("----構(gòu)造函數(shù)---");}//靜態(tài)的參數(shù)初始化 static {System.out.println("---靜態(tài)的參數(shù)初始化---");}//非靜態(tài)的參數(shù)初始化 {System.out.println("----非靜態(tài)的參數(shù)初始化---");} }Class常用方法解釋
Class就是普通的一個類,和我們平時寫的類沒有什么區(qū)別,它位于java.lang包下,和java.lang.reflect包下的類共同支持了java的整個反射功能。
?常用方法列表
getName()//返回String形式的該類的名稱。 newInstance()//根據(jù)某個Class對象產(chǎn)生其對應(yīng)類的實例,它調(diào)用的是此類的默認構(gòu)造方法(沒有默認無參構(gòu)造器會報錯) getClassLoader()//返回該Class對象對應(yīng)的類的類加載器。 getSuperClass()//返回某子類所對應(yīng)的直接父類所對應(yīng)的Class對象 isArray()//判定此Class對象所對應(yīng)的是否是一個數(shù)組對象 getComponentType() //如果當(dāng)前類表示一個數(shù)組,則返回表示該數(shù)組組件的 Class 對象,否則返回 null。 getConstructor(Class[])//返回當(dāng)前 Class 對象表示的類的指定的公有構(gòu)造子對象。 getConstructors() //返回當(dāng)前 Class 對象表示的類的所有公有構(gòu)造子對象數(shù)組。 getDeclaredConstructor(Class[]) //返回當(dāng)前 Class 對象表示的類的指定已說明的一個構(gòu)造子對象。 getDeclaredConstructors()//返回當(dāng)前 Class 對象表示的類的所有已說明的構(gòu)造子對象數(shù)組。 getDeclaredField(String)//返回當(dāng)前 Class 對象表示的類或接口的指定已說明的一個域?qū)ο蟆? getDeclaredFields() //返回當(dāng)前 Class 對象表示的類或接口的所有已說明的域?qū)ο髷?shù)組。 getDeclaredMethod(String, Class[])//返回當(dāng)前 Class 對象表示的類或接口的指定已說明的一個方法對象。 getDeclaredMethods() //返回 Class 對象表示的類或接口的所有已說明的方法數(shù)組。 getField(String)//返回當(dāng)前 Class 對象表示的類或接口的指定的公有成員域?qū)ο蟆? getFields()//返回當(dāng)前 Class 對象表示的類或接口的所有可訪問的公有域?qū)ο髷?shù)組。 getInterfaces()//返回當(dāng)前對象表示的類或接口實現(xiàn)的接口。 getMethod(String, Class[]) //返回當(dāng)前 Class 對象表示的類或接口的指定的公有成員方法對象。 getMethods()//返回當(dāng)前 Class 對象表示的類或接口的所有公有成員方法對象數(shù)組,包括已聲明的和從父類繼承的方法。 isInstance(Object)//此方法是 Java 語言 instanceof 操作的動態(tài)等價方法。 isInterface() //判定指定的 Class 對象是否表示一個接口類型 isPrimitive()//判定指定的 Class 對象是否表示一個 Java 的基類型。 newInstance() //創(chuàng)建類的新實例總結(jié)
以上就是本文關(guān)于淺談Java中的class類的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
總結(jié)
以上是生活随笔為你收集整理的java.lang包—类Class的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java并发编程—Thread类的sta
- 下一篇: java.lang包—类加载器Class