成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

java反射是如何實(shí)現(xiàn)的-創(chuàng)新互聯(lián)

java反射是如何實(shí)現(xiàn)的?這篇文章運(yùn)用了實(shí)例代碼展示,代碼非常詳細(xì),可供感興趣的小伙伴們參考借鑒,希望對(duì)大家有所幫助。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序設(shè)計(jì)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了李滄免費(fèi)建站歡迎大家使用!

Java反射
在 Java 中,并不是所有的類型信息都能在編譯階段明確,有一些類型信息需要在運(yùn)行時(shí)才能確定,這種機(jī)制被稱為 RTTI,即運(yùn)行時(shí)類型識(shí)別,運(yùn)行時(shí)類型識(shí)別主要由Class類實(shí)現(xiàn)。
1、 Class類
在Java中,我們常用“class”(首字母為小寫的c)關(guān)鍵字來定義一個(gè)類,說這個(gè)類是對(duì)某一類對(duì)象的抽象。你比如說王二是一個(gè)網(wǎng)絡(luò)知名作者,我們可以這樣簡(jiǎn)單地定義作者類:
package com.cmower.java_demo.fifteen;
class Author {
private String pen_name;
private String real_name;}
現(xiàn)在,我們想知道Writer這個(gè)類本身的一些信息(比如說類名),該怎么辦呢?這時(shí)候就需要用到“Class”(首字母為大寫的C)類,該類包含了與類有關(guān)的信息。請(qǐng)看以下代碼:
public class Test {
public static void main (String [] args) {
Author wanger = new Author();
Class c1 = wanger.getClass();
System.out.println(c1.getName());
//輸出 com.cmower.java_demo.fifteen.Author
}}
當(dāng)我們創(chuàng)建了作者對(duì)象wanger后,就可以通過wanger.getClass()獲取wanger的Class對(duì)象,通過c1.getName()可獲得wanger對(duì)象的類名。
想象一下,經(jīng)過五年的刻意練習(xí),張三從一名寫作愛好者晉升為一名作家了。我們用代碼來假裝一下:
package com.cmower.java_demo.fifteen;
class Author {
private String pen_name;
private String real_name;}
class Writer extends Author {
private String honour;}
public class Test {
public static void main (String [] args) {
Author wanger = new Writer();
Class c1 = wanger.getClass();
System.out.println(c1.getName());
//輸出 com.cmower.java_demo.fifteen.Writer
}}
在上例中,即使我們將Writer的對(duì)象引用wanger向上轉(zhuǎn)型為Author,wanger的Class對(duì)象類型依然是Writer(通過輸出結(jié)果可以判定)。這也就是說,Java能夠在運(yùn)行時(shí)自動(dòng)識(shí)別類型的信息,它不會(huì)因?yàn)閣anger的引用類型是Author而丟失wanger真正的類型信息(Writer)。Java是怎么做到這一點(diǎn)呢?
當(dāng)Java創(chuàng)建某個(gè)類的對(duì)象,比如Writer類對(duì)象時(shí),Java會(huì)檢查內(nèi)存中是否有相應(yīng)的Class對(duì)象。如果內(nèi)存中沒有相應(yīng)的Class對(duì)象,那么Java會(huì)在.class文件中尋找Writer類的定義,并加載Writer類的Class對(duì)象。
一旦Class對(duì)象加載成功,就可以用它來創(chuàng)建這種類型的所有對(duì)象。這也就是說,每個(gè)對(duì)象在運(yùn)行時(shí)都會(huì)有對(duì)應(yīng)的Class對(duì)象,這個(gè)Class對(duì)象包含了這個(gè)對(duì)象的類型信息。因此,我們能夠通過Class對(duì)象知道某個(gè)對(duì)象“真正”的類型,并不會(huì)因?yàn)橄蛏限D(zhuǎn)型而丟失。
02、 獲取Class對(duì)象的其他方式
在使用getClass()方法獲取一個(gè)類的Class對(duì)象時(shí),我們必須要先獲取這個(gè)類的對(duì)象,比如上面提到的wanger。如果我們之前沒有獲取這個(gè)類的對(duì)象,就需要用另外兩種方式來獲取類的Class對(duì)象:
Class c2 = Writer.class;System.out.println(c2.getName());
try {
Class c3 = Class.forName("com.cmower.java_demo.fifteen.Writer");
System.out.println(c3.getName());} catch (ClassNotFoundException e) {
e.printStackTrace();}
1)當(dāng)使用.class來獲取Class對(duì)象時(shí),不會(huì)自動(dòng)地初始化該Class對(duì)象,初始化被延遲到了對(duì)靜態(tài)方法或者非final靜態(tài)域進(jìn)行首次引用時(shí)才執(zhí)行。這樣做不僅更簡(jiǎn)單,而且更安全,因?yàn)樗诰幾g時(shí)就會(huì)受到檢查(因此不需要置于try語(yǔ)句塊中)。
2)Class.forName會(huì)自動(dòng)地初始化該Class對(duì)象,但需要指定類名,并且需要置于try語(yǔ)句塊中。
03、 Class類提供的常用方法
Class類為我們提供了一些非常有用的方法,比如說getName()用來返回類名,getPackage()返回類所在的包名。
我們還可以利用Class類提供的newInstance()方法來創(chuàng)建相應(yīng)類的對(duì)象,比如:
Class c2 = Writer.class;System.out.println(c2.getName());
try {
Writer wangsan = (Writer) c2.newInstance();
System.out.println(wangsan);
// 輸出:com.cmower.java_demo.fifteen.Writer@7852e922} catch (InstantiationException | IllegalAccessException e1) {
e1.printStackTrace();}
由于我們?cè)趧?chuàng)建Class對(duì)象c2時(shí)沒有使用泛型,所以newInstance()返回的對(duì)象類型需要強(qiáng)轉(zhuǎn)為Writer。我們可以在此基礎(chǔ)上進(jìn)行改進(jìn),示例如下:
Class<Writer> c4 = Writer.class;System.out.println(c4.getName());
try {
Writer wangsan = c4.newInstance();
System.out.println(wangsan);
// 輸出:com.cmower.java_demo.fifteen.Writer@7852e922} catch (InstantiationException | IllegalAccessException e1) {
e1.printStackTrace();}
04、 反射
我們還可以通過getFields()獲取所有public修飾的字段,通過getMethods()返回所有public修飾的方法。
甚至,我們還可以通過getDeclaredFields()獲取更多字段,包括公共、受保護(hù)、默認(rèn)(包)訪問和私有字段,但不包括繼承字段。對(duì)應(yīng)的,getDeclaredMethods()用來獲取更多方法。示例如下:
package com.cmower.java_demo.fifteen;
import java.lang.reflect.Field;import java.lang.reflect.Method;
class Author {
private String pen_name;
private String real_name;}
class Writer extends Author {
private String honour;

private void makeMoney() {
   System.out.println("很多很多錢");
}}

public class Test {
public static void main(String[] args) {

   Class<Writer> c4 = Writer.class;
   System.out.println(c4.getName());

   try {
     Writer wangsan = c4.newInstance();
     System.out.println(wangsan);

     Field[] fields = c4.getDeclaredFields();
     for (Field field : fields) {
       System.out.println(field.getName());
     }

     Method[] methods = c4.getDeclaredMethods();
     for (Method method : methods) {
       System.out.println(method.getName());
     }
   } catch (InstantiationException | IllegalAccessException e1) {
     e1.printStackTrace();
   }

}}

上面的例子其實(shí)涉及到了反射,F(xiàn)ield、Method(還有例子中未提到的Constructor)都來自java.lang.reflect類庫(kù)。Class類與java.lang.reflect類庫(kù)一起對(duì)反射的概念進(jìn)行了支持。
有時(shí)候,我們需要從磁盤文件或網(wǎng)絡(luò)文件中讀取一串字節(jié)碼,并把它轉(zhuǎn)換成一個(gè)類,這時(shí)候就需要用到反射。最常見的典型例子就是將一串JSON字符串(在網(wǎng)絡(luò)傳輸中最初的形態(tài)可能是字節(jié)數(shù)組)反射為對(duì)應(yīng)類型的對(duì)象。
阿里巴巴提供的FastJSON提供了 toJSONString() 和 parseObject() 方法來將 Java 對(duì)象與 JSON 相互轉(zhuǎn)換。調(diào)用toJSONString方法即可將對(duì)象轉(zhuǎn)換成 JSON 字符串,parseObject 方法則反過來將 JSON 字符串轉(zhuǎn)換成對(duì)象。FastJSON的內(nèi)部其實(shí)用的就是反射機(jī)制。
package com.cmower.common.util;
import java.io.UnsupportedEncodingException;
import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;
import com.alibaba.fastjson.JSON;
@SuppressWarnings("all")public class JsonUtil {
private static Log logger = LogFactory.getLog("json");

public static byte[] objectToByte(Object obj) throws UnsupportedEncodingException {
   String jsonStr = JSON.toJSONString(obj);
   logger.debug("序列化后數(shù)據(jù):" + jsonStr);
   return jsonStr.getBytes("UTF-8");
}

public static <T> T byteToObject(byte[] data, Class<T> obj) throws UnsupportedEncodingException {
   String objectString = new String(data, "UTF-8");
   logger.debug("反序列化后數(shù)據(jù) : " + objectString);
   return JSON.parseObject(objectString, obj);
}

public static <T> Object stringToObject(String data, Class<T> obj) throws UnsupportedEncodingException {
   logger.debug("反序列化后數(shù)據(jù) : " + data);
   return JSON.parseObject(data, obj);
}}

以上就是java反射的實(shí)現(xiàn)和應(yīng)用,詳細(xì)使用情況還得要大家自己使用過才能知道具體要領(lǐng)。如果想閱讀更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

新聞標(biāo)題:java反射是如何實(shí)現(xiàn)的-創(chuàng)新互聯(lián)
文章鏈接:http://jinyejixie.com/article44/dioohe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、定制開發(fā)、網(wǎng)站建設(shè)、服務(wù)器托管、搜索引擎優(yōu)化營(yíng)銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
临洮县| 东宁县| 永春县| 泸水县| 蕲春县| 建水县| 民权县| 遂川县| 江源县| 凉城县| 天全县| 密山市| 镇沅| 万山特区| 镇沅| 邵阳县| 惠州市| 乐清市| 青神县| 青神县| 什邡市| 林周县| 康保县| 耒阳市| 盐亭县| 永福县| 江津市| 阳江市| 开封市| 庆云县| 东阿县| 安义县| 保康县| 鸡东县| 锡林浩特市| 曲麻莱县| 大城县| 庆阳市| 独山县| 泰顺县| 白河县|