精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

高級 Java 思考筆記之反射的基本原理之一

開發(fā) 后端
原來我一直將java當做不用delete的c++來用,但是最近在工作上遇到一些問題,發(fā)現(xiàn)這樣的做法不管用,因為工作上遇到的java代碼采用了很多框架,例如spring boot之類。當我想深入了解這些框架的設計原理時發(fā)現(xiàn),如果不了解java的高級語法特性,這些框架的設計思維或運行方式根本就無法理解。

[[432232]]

原來我一直將java當做不用delete的c++來用,但是最近在工作上遇到一些問題,發(fā)現(xiàn)這樣的做法不管用,因為工作上遇到的java代碼采用了很多框架,例如spring boot之類。當我想深入了解這些框架的設計原理時發(fā)現(xiàn),如果不了解java的高級語法特性,這些框架的設計思維或運行方式根本就無法理解。

后來稍微調(diào)查一下發(fā)現(xiàn),自從java8之后,java的語法發(fā)生了巨大的變化,代碼的設計模式也不再像以前“不用delete的c++”,參照原來c++的思維去解讀java代碼已經(jīng)行不通了,于是重新學習,順便在學習和思考中做一些總結輸出。

java新增語法特征中,有較為抽象的一部分叫反射,其實說白了就是用程序來控制程序。java將一切概念都包含在類中,于是對應每一個具體類,語言體系還為特定的具體類生成了描述其特性的抽象類,例如我們定義了如下一個類:

  1. static public class HelloWorld { 
  2.     public void sayHelloWorld1(String s) { 
  3.            System.out.println("say hello world 1!: " + s); 
  4.        } 
  5.  
  6.        public void sayHelloWorld2(int i) { 
  7.            System.out.println("say hello world 2: " + i); 
  8.        } 
  9.  
  10.        protected  void sayHelloWorld3() { 
  11.            System.out.println("say hello world3"); 
  12.        } 
  13.  
  14.        private void sayHelloworld4() { 
  15.            System.out.println("say hello world4"); 
  16.        } 
  17.  
  18.        public String field1 = "hello"
  19.        protected int field2 = 1; 
  20.        private int field3 = 2; 
  21.  
  22.    } 

這個類里面有公有,保護,私有等幾個方法,虛擬機在為這個類生成字節(jié)碼時,還構建了另一個類,用于描述這個類的類,可以稱為它的源類,后者用來描述前者在編程語言上的特性,例如它包含了哪些方法,這些方法對應的參數(shù),返回值,公有私有等,如果把一個類比作人,那么反射其實就是x光掃描,它把你內(nèi)外的具體細節(jié)都暴露出來,我們看看怎么用反射來解讀上面定義的類:

  1. public static void manipulateHelloWorldClass(Object obj) { 
  2.         Class cls = obj.getClass(); 
  3.         //打印出類對象對應的類名 
  4.         System.out.println("object class name: " + cls.getName()); 
  5.         //返回實例對應的類所聲明的所有函數(shù) 
  6.         Method[] methods = cls.getDeclaredMethods(); 
  7.         for (Method method : methods) { 
  8.             System.out.println("delcared method name: " +  method.getName()); 
  9.         } 
  10.     } 
  11.  
  12.     public static void main(String[] args) { 
  13.         HelloWorld helloWorld = new HelloWorld(); 
  14.         manipulateHelloWorldClass(helloWorld); 
  15.     } 

上面代碼運行后輸出結果如下:

可以看到,代碼打印出helloword實例對象在編程語言上的信息,例如上面代碼就打印出它對應類的名字,都有哪些方法等等,在Java語言中Class類也叫原類,它用來解析所有實例對應類在編程語法上的信息,每個實例對應的類都能得到一個Class類對應的實例,就像代碼中那樣,這個實例能夠查詢對應類有哪些方法,定義了哪些字段.

代碼中調(diào)用了getDeclaredMethods來獲得實例所對應類在定義時聲明的所有方法,Class類還有一個方法叫getMethods,它返回實例對應類自己在定義時所聲明的公有方法,以及繼承過來的所有公有方法。

反射機制一個很重要的作用就是能夠查詢給定實例是否有特定接口,然后調(diào)用相關接口,代碼如下:

  1. public static void callMethod(Object obj) { 
  2.         Class cls = obj.getClass(); 
  3.         try { 
  4.             Method method = cls.getMethod("sayHelloWorld1", new Class[] {String.class}); 
  5.             method.invoke(obj, new Object[]{"hello world"}); 
  6.             method = cls.getMethod("sayHelloWorld2", new Class[] {int.class}); 
  7.             method.invoke(obj, new Object[]{new Integer(123)}); 
  8.         } catch(NoSuchMethodException e) { 
  9.             e.printStackTrace();; 
  10.         } catch (IllegalAccessException e) { 
  11.             throw new IllegalArgumentException("Insufficient access permissions to call" 
  12.                     + "setColor(:Color) in class " + cls.getName()); 
  13.         } catch (InvocationTargetException ex) { 
  14.             throw new RuntimeException(ex); 
  15.         } 
  16.  
  17.     } 
  18.  
  19.     public static void main(String[] args) { 
  20.         HelloWorld helloWorld = new HelloWorld(); 
  21.       //  manipulateHelloWorldClass(helloWorld); 
  22.         callMethod(helloWorld); 
  23.     } 

上面代碼執(zhí)行后結果如下所示:

我們可以體會到,c++是不會有這種特性的,java由于具備了這種反射機制,使得它能夠用來開發(fā)很多框架,在java世界里形形色色的框架特別多,這跟它在語法上支持反射不無關系,類似spring boot這些java程序員絕對必須要掌握的框架,它的設計就大量使用了反射機制。

使用反射功能還可以很好的實現(xiàn)類實例的序列化,當我們想要將一個類實例的信息從內(nèi)存存儲到硬盤時,我們就需要將類實例當前內(nèi)部各個字段的信息存儲到文件里,以后需要的時候再從文件中讀出,然后利用讀到的數(shù)據(jù)重新把類的實例new出來,因此實現(xiàn)序列化第一步就是要獲得類實例所有字段的數(shù)據(jù),相應代碼如下:

  1. import java.lang.reflect.*; 
  2. import java.util.*; 
  3.  
  4. public class Serializer { 
  5.     public static Field[] getInstanceVariable(Object obj) { 
  6.         Class cls = obj.getClass(); 
  7.         List accumFields = new LinkedList(); 
  8.         while (cls != null) { 
  9.             //獲得實例對應類所聲明的全部字段 
  10.             Field[] fields = cls.getDeclaredFields(); 
  11.             for (Field field : fields) { 
  12.                 accumFields.add(field); //將字段對應的元類對象存儲起來 
  13.             } 
  14.  
  15.             cls = cls.getSuperclass(); //獲得父類對象 
  16.         } 
  17.     } 

代碼中要注意到,實例化一個類實例時,還需要考慮這個類的繼承關系,如果它有父類的話,我們還需要取得其父類的字段對應的信息,所以代碼中使用getSupperclass方法獲得實例對應類的父類的源類對象。

前面代碼中我們看到,F(xiàn)ield類對應的getModifier能返回字段的修飾屬性,也就是字段是public, private, protected , static, native等等,它返回的是一個2的指數(shù)冪數(shù)值,實際上它對應一個16比特位數(shù)值,當字段屬于哪種情況,就在相應的比特位上設置為1,因為字段的屬性總共有16種,因此getModifier返回一個2字節(jié)的整數(shù)。

得到這個數(shù)值后,我們再調(diào)用一系列方法獲得其屬性,例如isPublic返回字段是否是public類型,isPrivate返回字段是否為private類型等。由于我們在序列化一個實例時,不用關注那些靜態(tài)變量,因為靜態(tài)變量的值是寫死的,因此需要對上面的代碼進行修改,忽略掉那些被static修飾的字段:

  1. import java.lang.reflect.*; 
  2. import java.util.*; 
  3.  
  4. public class Serializer { 
  5.     public static Field[] getInstanceVariable(Object obj) { 
  6.         Class cls = obj.getClass(); 
  7.         List accumFields = new LinkedList(); 
  8.         while (cls != null) { 
  9.             //獲得實例對應類所聲明的全部字段 
  10.             Field[] fields = cls.getDeclaredFields(); 
  11.             for (Field field : fields) { 
  12.                 //確保字段不是static類型 
  13.                 if(!Modifier.isStatic(field.getModifiers())) { 
  14.                     accumFields.add(field); 
  15.                 } 
  16.             } 
  17.  
  18.             cls = cls.getSuperclass(); //獲得父類對象 
  19.         } 
  20.  
  21.         Field[] retvalue = new Field[accumFields.size()]; 
  22.         return (Field[])accumFields.toArray(retvalue); 
  23.     } 

這里還有很多問題需要考慮,例如序列化實例時,我們需要獲取類實例里面字段的值,但是如果字段屬性是private或者protected時,我們就不能直接從類實例中讀取字段內(nèi)容,同時如果字段對應的是數(shù)組類型,那么我們還得采取特定的處理方法,為了防止文章長度過長令人看不下去,我們把這些內(nèi)容總結再下一篇。

 

責任編輯:武曉燕 來源: Coding迪斯尼
相關推薦

2012-01-12 14:37:34

jQuery

2016-08-17 23:53:29

網(wǎng)絡爬蟲抓取系統(tǒng)

2013-04-07 14:09:55

Android應用基本

2020-03-21 14:57:14

手機定位智能手機APP

2010-08-20 13:29:33

OFDM

2009-02-24 09:43:00

IP電話原理

2011-11-29 12:17:00

2010-03-18 20:13:03

Java socket

2021-04-27 19:21:48

HBase原理開源

2011-08-10 19:33:09

Cocoa對象

2020-10-14 06:23:54

SpringBean實例化

2010-03-17 13:35:02

2019-11-28 10:45:28

ZooKeeper源碼分布式

2016-08-18 00:04:09

網(wǎng)絡爬蟲抓取系統(tǒng)服務器

2021-02-08 21:40:04

SockmapBPF存儲

2010-06-18 17:28:37

Linux Anacr

2020-11-26 13:54:03

容器LinuxDocker

2009-06-11 09:56:09

MySQL Repli原理

2011-07-07 14:10:21

Cocoa 內(nèi)省 hash

2020-12-29 16:55:44

ZooKeeper運維數(shù)據(jù)結構
點贊
收藏

51CTO技術棧公眾號

国产在线观看你懂的| 日韩欧美99| 国产一级做a爰片在线看免费| 风间由美中文字幕在线看视频国产欧美| 亚洲一区二区免费视频| 麻豆亚洲一区| 国产免费av电影| 日韩午夜免费| 色婷婷综合成人av| 国产午夜在线一区二区三区| 91福利精品在线观看| 一区二区欧美视频| 午夜精品区一区二区三| www.五月婷| 蜜桃av一区二区三区| 久久乐国产精品| 来吧亚洲综合网| 亚洲精品aaaaa| 日韩亚洲欧美在线| 第四色婷婷基地| 岛国av在线网站| 成人免费一区二区三区在线观看 | 天天操天天操天天操天天| 色777狠狠狠综合伊人| 亚洲国产精品高清久久久| 五月婷婷六月丁香激情| 午夜伦理福利在线| 一区二区三区精品在线| 伊人久久大香线蕉午夜av| 三级av在线| av在线这里只有精品| 91视频国产高清| 亚洲中文一区二区三区| 日韩激情一二三区| 国产成人精品免高潮费视频| 三级黄色在线视频| 伊人久久大香线蕉av超碰演员| 久久久999国产| 我不卡一区二区| 五月综合久久| 日韩精品极品毛片系列视频| 亚洲av午夜精品一区二区三区| 欧洲亚洲精品久久久久| 欧美优质美女网站| 久久99999| 香蕉成人影院| 欧美中文字幕久久| 网站一区二区三区| 精品福利在线| 欧美日韩国产精选| 免费成人黄色大片| 日韩亚洲国产免费| 这里只有精品电影| 久久发布国产伦子伦精品| 电影一区中文字幕| 91精品国产综合久久久久| 中文字幕 欧美日韩| 台湾天天综合人成在线| 欧美日韩国产a| 一区二区三区四区毛片| 国产在线不卡一区二区三区| 91麻豆精品国产91久久久久久久久 | 国产精品区一区二区三含羞草| 精品国产免费无码久久久| 国产精品一区专区| 国产一区二区三区四区五区加勒比| 秋霞视频一区二区| 99re热这里只有精品视频| 精品综合在线| 成人精品一区二区三区校园激情| 欧美激情中文字幕一区二区| 在线免费观看成人| 欧美人与禽猛交乱配| 五月婷婷激情综合| 国产成人无码精品久久久性色| 高潮一区二区| 欧美日韩激情一区二区三区| 色姑娘综合天天| 久久精品凹凸全集| 国产亚洲欧美日韩一区二区| 亚洲天堂一级片| 伊人激情综合| 国产精品高清在线观看| av片免费播放| 91亚洲精华国产精华精华液| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美一级片免费播放| 电影网一区二区| 91精品国产欧美一区二区成人| 成人免费看片载| 亚洲a级精品| 不卡毛片在线看| 天天操天天爽天天干| 久久九九免费| 亚洲在线免费视频| 国产在线中文字幕| 一区二区三区产品免费精品久久75| 日本www在线视频| 欧美视频第一| 日韩av在线网址| 精品无码一区二区三区蜜臀| 一区二区国产在线观看| 成人免费视频网址| 亚洲人午夜射精精品日韩| 中文字幕一区二区日韩精品绯色| 国产深夜男女无套内射| 亚洲图片小说区| 国产午夜精品久久久| 欧美成人片在线观看| 日韩国产欧美在线播放| 国产乱码精品一区二区三区不卡| 欧美激情免费| 日本韩国欧美一区二区三区| 88av在线播放| 亚洲色图国产| 国产精品高清网站| 色在线免费视频| 亚洲综合在线五月| 日韩成人精品视频在线观看| 欧美另类69xxxxx| 午夜精品久久久久久久久久久久久| 日本熟女毛茸茸| 成人av电影在线播放| 青春草在线视频免费观看| 欧美精品总汇| 精品视频久久久久久久| 日韩av一二三区| 国产91精品一区二区麻豆亚洲| 一区二区三区不卡在线| 日本精品另类| 亚洲人成电影在线播放| 在线观看精品国产| 丁香激情综合五月| 欧美交换配乱吟粗大25p| 国产精品亚洲欧美一级在线| 色狠狠av一区二区三区香蕉蜜桃| 日本中文字幕久久| 久久久久88色偷偷免费| 国产精品免费成人| 免费成人av| 欧美中文在线观看| 水莓100国产免费av在线播放| 亚洲久本草在线中文字幕| 激情文学亚洲色图| 小小影院久久| 91精品综合视频| 操你啦视频在线| 日韩欧美国产wwwww| 69av视频在线| 国产999精品久久| 国产精品三级一区二区| jazzjazz国产精品久久| 97精品在线观看| 天堂а√在线8种子蜜桃视频| 偷拍一区二区三区| 久久久亚洲av波多野结衣| 亚洲女人av| 日韩欧美亚洲日产国| 日本久久一区| 美女av一区二区| 亚洲精品18p| 欧美日韩在线视频一区| 久久精品—区二区三区舞蹈 | 国产欧美va欧美va香蕉在线| 午夜免费视频在线国产| 欧美日韩你懂得| 成人涩涩小片视频日本| 国产成人h网站| 大j8黑人w巨大888a片| 久久99高清| 成人亚洲激情网| 97蜜桃久久| 一本色道久久88精品综合| 国产精品国产av| 亚洲成人一区在线| 亚洲色成人网站www永久四虎 | 五月天精品视频| 韩国一区二区在线观看| 久草免费福利在线| 女厕嘘嘘一区二区在线播放| 国产美女搞久久| 人人澡人人添人人爽一区二区| 国产丝袜视频一区| 国产一区二区在线播放视频| 亚洲成av人**亚洲成av**| 亚洲色图欧美色| 处破女av一区二区| 国产日韩成人内射视频| 自拍偷拍欧美| 欧美一区国产一区| 视频在线一区| 国产成人精品在线观看| 日本孕妇大胆孕交无码| 一本色道久久88综合日韩精品| 国产熟女一区二区丰满| 欧美性猛xxx| 国产精品久久久久久久精| 26uuu久久天堂性欧美| 精品人妻一区二区三区免费| 日精品一区二区三区| 国产 欧美 日韩 一区| blacked蜜桃精品一区| 岛国视频一区免费观看| 国产精品天堂蜜av在线播放 | 欧美综合影院| 欧洲日韩成人av| 手机av免费在线| 色青青草原桃花久久综合| 深夜影院在线观看| 日韩精品一区二区三区老鸭窝 | 电影一区二区三| 欧美极品美女视频网站在线观看免费| av在线日韩国产精品| 亚洲第一色在线| 国产sm主人调教女m视频| 欧洲一区二区三区免费视频| 在线观看亚洲欧美| 一区二区三区在线观看网站| 在线免费看视频| 久久久噜噜噜久久中文字幕色伊伊| 国产ts在线观看| 国产一区视频导航| 日本超碰在线观看| 日韩中文欧美在线| 亚洲熟妇av一区二区三区| 极品av少妇一区二区| 精品国产一区二区三区在线| 久久国产成人精品| 亚洲精品成人三区| re久久精品视频| 日本高清不卡一区二区三| 色哟哟精品丝袜一区二区| 国产伦理久久久| 在线日韩成人| 国产精品日韩欧美一区二区三区| 日韩成人在线看| 亚洲永久免费观看| 国产在线不卡一区二区三区| 亚洲尤物视频网| 日韩在线视频一区二区三区| 亚洲a一级视频| 国产高清精品二区| 亚洲综合中文字幕在线| 国语精品视频| 成人av免费在线看| caoporn成人| 久久99精品久久久久子伦| 欧美一级一片| 欧美日韩一区二区三区在线观看免| 色天天色综合| 日韩中文不卡| 日韩欧美自拍| 久久久无码中文字幕久...| 亚洲在线久久| 日韩精品一区二区在线视频 | 色视频在线观看福利| 亚洲乱码一区二区| h视频网站在线观看| 俺也去精品视频在线观看| 成人午夜在线影视| 欧美激情2020午夜免费观看| 九九精品调教| 欧美一级黑人aaaaaaa做受| se01亚洲视频| 成人网中文字幕| 福利在线一区| 麻豆视频成人| 久久久久久美女精品| 国产一区二区三区在线免费| 亚洲一区二区网站| 老司机午夜性大片| 国产不卡在线一区| 草草影院第一页| 亚洲四区在线观看| 久一视频在线观看| 91高清视频在线| 国产口爆吞精一区二区| 亚洲国产黄色片| 国产色a在线| 欧美不卡视频一区发布| 一区二区精品伦理... | 999国产精品视频免费| 精品久久久久久久久久久久久久久 | 亚洲欧洲xxxx| 国产福利视频在线观看| 91国产美女在线观看| 免费视频成人| 成人欧美一区二区| 免费av一区二区三区四区| 4444在线观看| 日韩极品在线观看| 国产精品一区二区无码对白| 国产免费成人在线视频| 国产精品theporn动漫| 欧美另类变人与禽xxxxx| 人妻夜夜爽天天爽| 久久精视频免费在线久久完整在线看| 国产中文在线播放| 亚洲iv一区二区三区| 国产成人1区| 国产一区二区四区| 久久精品国产精品亚洲精品| 好吊一区二区三区视频| 一区二区三区在线不卡| 一区二区视频播放| 亚洲欧美日韩在线一区| 国产黄色大片在线观看| 国产精品网址在线| 美女久久久久| 69sex久久精品国产麻豆| 精品一区二区三区影院在线午夜| 久久丫精品国产亚洲av不卡| 一区二区三区色| 一区二区日韩在线观看| 亚洲香蕉av在线一区二区三区| 91在线三级| 99re国产| 久久久久国产| 亚洲国产高清av| 国产亚洲欧洲997久久综合| 日韩人妻无码一区二区三区99| 欧美一区二区在线播放| 日本高清在线观看wwwww色| 国产精品成人久久久久| 九九视频精品全部免费播放| 亚洲熟妇无码一区二区三区| 国产激情一区二区三区桃花岛亚洲| 亚洲精品天堂网| 欧美日韩性生活| av网站在线免费播放| 国产精品久久久久久久久借妻| 中文字幕亚洲影视| 无码人妻精品一区二区三区在线| 国产福利精品一区| 欧美人妻精品一区二区三区| 这里只有精品视频在线观看| 国产三区视频在线观看| 91视频8mav| 亚洲女同中文字幕| 深夜做爰性大片蜜桃| 亚洲免费在线看| 不卡视频免费在线观看| 色在人av网站天堂精品| 色播一区二区| 国产乱子伦精品无码专区| 国产成人免费xxxxxxxx| 久久久久99精品成人片毛片| 精品粉嫩超白一线天av| 理论不卡电影大全神| 欧美黑人3p| 日韩国产高清影视| 999精品久久久| 欧美一级欧美三级| 女同视频在线观看| 精品国产一区二区三区四区vr| 亚洲一区二区动漫| 少妇愉情理伦三级| 欧美精品自拍偷拍动漫精品| 在线视频国产区| 国产成人一区二区三区免费看| 亚洲美女视频在线免费观看| 99久久久久久久久久| 欧美午夜视频网站| a视频在线播放| 国产麻豆乱码精品一区二区三区| 国产精品外国| 色婷婷国产精品免| 日韩视频免费观看高清完整版| 成人ssswww在线播放| 欧美日韩精品久久| 精品在线观看免费| 日本三级2019| 正在播放国产一区| 日韩精品一区国产| 成年网站在线免费观看| 国产精品国产三级国产aⅴ入口| 精品国产av 无码一区二区三区| 韩国三级日本三级少妇99| 精品不卡一区| 免费黄色在线播放| 色噜噜狠狠色综合欧洲selulu| 精品国产白色丝袜高跟鞋| 国语精品中文字幕| 久久精品国产精品亚洲综合| 日本最新中文字幕| 日韩在线免费av| 女人抽搐喷水高潮国产精品| 一区二区三区 日韩| 亚洲国产aⅴ天堂久久| 成年人视频在线看| 国产精品有限公司| 国内欧美视频一区二区| 九九热精品视频在线| 美女视频久久黄| 狠狠做深爱婷婷综合一区| xxxx国产视频| 欧美日韩在线免费视频| 国产剧情av在线播放| 一区二区三区四区免费观看| 91美女片黄在线|