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

Java反射進階—聊聊反射的幾個問題

開發(fā) 后端
昨天有朋友反映好多反射知識沒說到,所以今天算是補充篇,一起看看反射的進階知識點。

[[376885]]

前言

昨天有朋友反映好多反射知識沒說到,所以今天算是補充篇,一起看看反射的進階知識點。

反射可以修改final類型成員變量嗎?

final我們應該都知道,修飾變量的時候代表是一個常量,不可修改。那利用反射能不能達到修改的效果呢?

我們先試著修改一個用final修飾的String變量。

  1. public class User { 
  2.     private final String name = "Bob"
  3.     private final Student student = new Student(); 
  4.      
  5.     public String getName() { 
  6.         return name
  7.     } 
  8.  
  9.     public Student getStudent() { 
  10.         return student; 
  11.     } 
  12.  
  13.  
  14.     User user = new User(); 
  15.     Class clz = User.class; 
  16.     Field field1 = null
  17.     try{ 
  18.         field1=clz.getDeclaredField("name"); 
  19.         field1.setAccessible(true); 
  20.         field1.set(user,"xixi"); 
  21.         System.out.println(user.getName()); 
  22.     }catch(NoSuchFieldException e){ 
  23.         e.printStackTrace(); 
  24.     }catch(IllegalAccessException e){ 
  25.         e.printStackTrace(); 
  26.     } 

打印出來的結果,還是Bob,也就是沒有修改到。

我們再修改下student變量試試:

  1. field1 = clz.getDeclaredField("student"); 
  2. field1.setAccessible(true); 
  3. field1.set(user, new Student()); 
  4.  
  5. 打印: 
  6. 修改前com.example.studynote.reflection.Student@77459877 
  7. 修改后com.example.studynote.reflection.Student@72ea2f77 

可以看到,對于正常的對象變量即使被final修飾也是可以通過反射進行修改的。

這是為什么呢?為什么String不能被修改,而普通的對象變量可以被修改呢?

先說結論,其實String值也被修改了,只是我們無法通過這個對象獲取到修改后的值。

這就涉及到JVM的內(nèi)聯(lián)優(yōu)化了:

內(nèi)聯(lián)函數(shù),編譯器將指定的函數(shù)體插入并取代每一處調(diào)用該函數(shù)的地方(上下文),從而節(jié)省了每次調(diào)用函數(shù)帶來的額外時間開支。

簡單的說,就是JVM在處理代碼的時候會幫我們優(yōu)化代碼邏輯,比如上述的final變量,已知final修飾后不會被修改,所以獲取這個變量的時候就直接幫你在編譯階段就給賦值了。

所以上述的getName方法經(jīng)過JVM編譯內(nèi)聯(lián)優(yōu)化后會變成:

  1. public String getName() { 
  2.        return "Bob"
  3.    } 

所以無論怎么修改,都獲取不到修改后的值。

有的朋友可能提出直接獲取name呢?比如這樣:

  1. //修改為public 
  2. public final String name = "Bob"
  3.  
  4. //反射修改后,打印user.name 
  5. field1=clz.getDeclaredField("name"); 
  6. field1.setAccessible(true); 
  7. field1.set(user,"xixi"); 
  8. System.out.println(user.name); 

不好意思,還是打印出來Bob。這是因為System.out.println(user.name)這一句在經(jīng)過編譯后,會被寫成:

  1. System.out.println(user.name
  2.  
  3. //經(jīng)過內(nèi)聯(lián)優(yōu)化 
  4.  
  5. System.out.println("Bob"

所以:

「反射是可以修改final變量的,但是如果是基本數(shù)據(jù)類型或者String類型的時候,無法通過對象獲取修改后的值,因為JVM對其進行了內(nèi)聯(lián)優(yōu)化。」

那有沒有辦法獲取修改后的值呢?

有,可以通過反射中的Field.get(Object obj)方法獲取:

  1. //獲取field對應的變量在user對象中的值 
  2. System.out.println("修改后"+field.get(user)); 

反射獲取static靜態(tài)變量

說完了final,再說說static,怎么修改static修飾的變量呢?

我們知道,靜態(tài)變量是在類的實例化之前就進行了初始化(類的初始化階段),所以靜態(tài)變量是跟著類本身走的,跟具體的對象無關,所以我們獲取變量就不需要傳入對象,直接傳入null即可:

 

  1. public class User { 
  2.  public static String name
  3.  
  4.  
  5. field2 = clz.getDeclaredField("name"); 
  6. field2.setAccessible(true); 
  7. //獲取靜態(tài)變量 
  8. Object getname=field2.get(null); 
  9. System.out.println("修改前"+getname); 
  10.  
  11. //修改靜態(tài)變量 
  12. field2.set(null"xixi"); 
  13. System.out.println("修改后"+User.name); 

如上述代碼:

  • Field.get(null) 可以獲取靜態(tài)變量。
  • Field.set(null,object) 可以修改靜態(tài)變量。

怎么提升反射效率

1、緩存重復用到的對象

利用緩存,其實我不說大家也都知道,在平時項目中用到多次的對象也會進行緩存,誰也不會多次去創(chuàng)建。

但是,這一點在反射中尤為重要,比如Class.forName方法,我們做個測試:

  1. long startTime = System.currentTimeMillis(); 
  2.     Class clz = Class.forName("com.example.studynote.reflection.User"); 
  3.     User user
  4.     int i = 0; 
  5.     while (i < 1000000) { 
  6.         i++; 
  7.         //方法1,直接實例化 
  8.         user = new User(); 
  9.         //方法2,每次都通過反射獲取class,然后實例化 
  10.         user = (User) Class.forName("com.example.studynote.reflection.User").newInstance(); 
  11.         //方法3,通過之前反射得到的class進行實例化 
  12.         user = (User) clz.newInstance(); 
  13.     } 
  14.  
  15.     System.out.println("耗時:" + (System.currentTimeMillis() - startTime)); 

打印結果:

  1. 1、直接實例化 
  2. 耗時:15 
  3.  
  4. 2、每次都通過反射獲取class,然后實例化 
  5. 耗時:671 
  6.  
  7. 3、通過之前反射得到的class進行實例化 
  8. 耗時:31 

所以看出來,只要我們合理的運用這些反射方法,比如Class.forName,Constructor,Method,F(xiàn)ield等,盡量在循環(huán)外就緩存好實例,就能提高反射的效率,減少耗時。

2、setAccessible(true)

之前我們說過當遇到私有變量和方法的時候,會用到setAccessible(true)方法關閉安全檢查。這個安全檢查其實也是耗時的。

所以我們在反射的過程中可以盡量調(diào)用setAccessible(true)來關閉安全檢查,無論是否是私有的,這樣也能提高反射的效率。

3、ReflectASM

ReflectASM 是一個非常小的 Java 類庫,通過代碼生成來提供高性能的反射處理,自動為 get/set 字段提供訪問類,訪問類使用字節(jié)碼操作而不是 Java 的反射技術,因此非常快。

ASM是一個通用的Java字節(jié)碼操作和分析框架。它可以用于修改現(xiàn)有類或直接以二進制形式動態(tài)生成類。

簡單的說,這是一個類似反射,但是不同于反射的高性能庫。他的原理是通過ASM庫,生成了一個新的類,然后相當于直接調(diào)用新的類方法,從而完成反射的功能。

感興趣的可以去看看源碼,實現(xiàn)原理比較簡單——https://github.com/EsotericSoftware/reflectasm。

「小總結:」經(jīng)過上述三種方法,我想反射也不會那么可怕到大大影響性能的程度了,如果真的發(fā)現(xiàn)反射影響了性能以及實際使用的情況,也許可以研究下,是否是因為沒用對反射和沒有處理好反射相關的緩存呢?

反射原理

如果我們試著查看這些反射方法的源碼,會發(fā)現(xiàn)最終都會走到native方法中,比如

getDeclaredField方法會走到

  1. public native Field getDeclaredField(String name) throws NoSuchFieldException; 

那么在底層,是怎么獲取到類的相關信息的呢?

首先回顧下JVM加載Java文件的過程:

  • 編譯階段,.java文件會被編譯成.class文件,.class文件是一種二進制文件,內(nèi)容是JVM能夠識別的機器碼。
  • .class文件里面依次存儲著類文件的各種信息,比如:版本號、類的名字、字段的描述和描述符、方法名稱和描述、是不是public、類索引、字段表集合,方法集合等等數(shù)據(jù)。
  • 然后,JVM中的類加載器會讀取字節(jié)碼文件,取出二進制數(shù)據(jù),加載到內(nèi)存中,并且解析.class文件的信息。
  • 類加載器會獲取類的二進制字節(jié)流,在內(nèi)存中生成代表這個類的java.lang.Class對象。
  • 最后會開始類的生命周期,比如連接、初始化等等。

而反射,就是去操作這個 java.lang.Class對象,這個對象中有整個類的結構,包括屬性方法等等。

總結來說就是,.class是一種有順序的結構文件,而Class對象就是對這種文件的一種表示,所以我們能從Class對象中獲取關于類的所有信息,這就是反射的原理。

說點無關本文的

最近有一些關于文章中分析源碼部分的想法,以前總想把源碼原封不動的搬上來,好讓大家線下也能找到相關的源碼然后通讀。

但是可能這樣不大現(xiàn)實?而且也造成了很多朋友讀文章的障礙,很可能當時一知半解,下來全部忘記,至少我就是這樣的哈哈。

所以可能在寫文章中涉及到源碼解析部分,盡量精簡寫出來,或者直接貼上偽代碼能更方便大家理解吧~

以后試一試。

拜拜

Android體系架構(連載文章、腦圖、面試專題):https://github.com/JiMuzz/Android-Architecture

參考

https://juejin.cn/post/6844903905483030536 https://www.zhihu.com/question/46883050 https://juejin.cn/post/6917984253360177159 https://blog.csdn.net/PiaoMiaoXiaodao/article/details/79871313 https://www.cnblogs.com/coding-night/p/10772631.html

本文轉載自微信公眾號「碼上積木」,可以通過以下二維碼關注。轉載本文請聯(lián)系碼上積木公眾號。

 

責任編輯:武曉燕 來源: 碼上積木
相關推薦

2021-01-18 10:33:53

Java反射模塊

2021-10-12 00:04:24

腳本備份MariDB

2013-05-06 15:42:49

2010-06-09 16:57:14

路由選擇協(xié)議

2011-05-18 11:31:56

數(shù)據(jù)安全數(shù)據(jù)備份

2009-09-07 14:39:14

2011-07-01 09:31:49

.net

2021-03-03 21:24:57

數(shù)據(jù)倉庫工具

2024-06-04 00:00:30

C#反射編程

2011-07-04 16:40:39

QT 串口 QML

2024-11-08 08:56:01

2013-11-12 09:16:00

SDN思科Insieme

2009-11-06 14:07:58

Oracle用戶表空間

2022-01-12 08:53:04

數(shù)字化疫情企業(yè)發(fā)展

2013-08-29 09:47:32

開源hypervisor

2021-11-26 07:31:43

Java反射程序

2015-09-23 09:08:38

java反射

2012-04-05 13:50:38

Java

2011-09-14 15:23:00

Android 2.2

2021-06-05 23:39:52

c++函數(shù)場景
點贊
收藏

51CTO技術棧公眾號

天天爽人人爽夜夜爽| 国产欧洲精品视频| 亚洲永久无码7777kkk| 在线天堂新版最新版在线8| 久久久久免费观看| 91九色视频在线| 男人的天堂一区二区| 久久99视频| 91精品国产综合久久久久久漫画 | 小小影院久久| 亚洲第一精品夜夜躁人人躁| www.激情小说.com| av中文字幕在线看| 国产精品久久免费看| 国产伦精品一区二区三区视频黑人 | 日韩欧美主播在线| 中文字幕乱码免费| 川上优的av在线一区二区| 国产不卡视频在线播放| 国产精品久久久久久久久久东京| 久久久精品91| 欧美成人激情| 亚洲人a成www在线影院| 国产吃瓜黑料一区二区| 国产精品诱惑| 色综合天天视频在线观看| 日本香蕉视频在线观看| 日本天堂在线观看| 国产婷婷色一区二区三区在线| 99精品国产一区二区| 一道本无吗一区| 老牛国产精品一区的观看方式| 久久久人成影片一区二区三区观看| 一级免费黄色录像| 国产成人三级| 日韩国产精品一区| 人妻体内射精一区二区三区| 国产视频一区二| 欧美精品久久天天躁| 99视频在线免费| 韩日精品一区二区| 黑人巨大精品欧美一区二区一视频| 成人在线观看毛片| av毛片在线播放| 中文字幕字幕中文在线中不卡视频| 日韩欧美一二三| 999在线观看| 秋霞国产精品| 欧美亚洲精品一区| 久久九九国产视频| 桃子视频成人app| 色老头久久综合| 熟女人妇 成熟妇女系列视频| 中文一区一区三区高中清不卡免费| 亚洲1区2区3区4区| 日本午夜激情视频| 绿色成人影院| 色婷婷国产精品| 国产成人av影视| 精品肉辣文txt下载| 色视频成人在线观看免| 青青在线视频免费| 四虎影视国产精品| 日韩一区二区三区四区五区六区| 一级黄色免费毛片| 国产精品久久久久av蜜臀| 亚洲第一网站男人都懂| 女同性恋一区二区三区| 欧美亚视频在线中文字幕免费| 亚洲国产精品美女| 亚洲 小说 欧美 激情 另类| 精品国产123区| 日韩中文字幕在线看| 91n在线视频| 黄色工厂这里只有精品| 久久久久久69| 久久精品一二区| 日本麻豆一区二区三区视频| 精品高清在线| 中文字幕精品在线| 我要看黄色一级片| 一本色道久久| 国产精品男人的天堂| 国产美女主播在线观看| aaa欧美色吧激情视频| 欧美日韩天天操| 麻豆视频在线播放| 午夜久久久久久电影| 日本新janpanese乱熟| 国产精品2区| 日韩av在线免费播放| 永久免费观看片现看| 欧美精品观看| 国产精品第一区| 亚洲精品一级片| 国产视频一区二区三区在线观看| 四虎精品欧美一区二区免费| 成人欧美大片| 欧美一级精品大片| 亚洲一区二区三区日韩| 欧美一区二区三区免费看| 欧美性一区二区三区| 91成人国产综合久久精品| 成人国产一区二区三区精品| 亚洲国产高清国产精品| 9765激情中文在线| 欧美精选午夜久久久乱码6080| 91精品又粗又猛又爽| 水蜜桃久久夜色精品一区| 97精品一区二区三区| 91精品国产乱码久久久| 久久先锋资源网| 国产精品自拍合集| 99久久久国产精品免费调教网站| 亚洲第一福利在线观看| 日韩激情小视频| 老司机午夜精品视频| 国产精品久久亚洲7777| 免费黄色在线| 欧美性欧美巨大黑白大战| 中文字幕乱码一区| 午夜久久一区| 亚洲自拍偷拍区| 日本在线人成| 欧美午夜精品一区| 中国毛片在线观看| 99精品福利视频| 国产精品高清一区二区三区| 成码无人av片在线观看网站| 欧美色网一区二区| 亚洲а∨天堂久久精品2021| 国产精品亚洲综合久久| 成人9ⅰ免费影视网站| 日韩av中文| 色欧美片视频在线观看在线视频| 艳妇乳肉亭妇荡乳av| 久久中文字幕一区二区| 搡老女人一区二区三区视频tv| 午夜精品免费观看| 国产亚洲欧美色| www日韩视频| 九热爱视频精品视频| 91国内产香蕉| 偷拍自拍在线视频| 91丨九色丨国产丨porny| 欧美 亚洲 视频| 精品一级视频| 欧美另类99xxxxx| www.久久成人| 一区二区三区精品视频在线| 国产精品19p| 欧美久久成人| 精品久久精品久久| 日韩在线伦理| 国产亚洲人成网站在线观看| 日韩xxx视频| 国产精品久久久久久久裸模| 老司机久久精品| 久久久久久久久久久妇女 | 在线国产精品播放| 波多野结衣激情视频| 国产精品每日更新| 女同激情久久av久久| 外国成人激情视频| 亚洲综合视频1区| 欧美aaaxxxx做受视频| 精品国产成人在线影院| 日韩欧美一级视频| 国产三级三级三级精品8ⅰ区| 高清一区二区视频| 91精品国产自产拍在线观看蜜| 3d精品h动漫啪啪一区二区| 天堂亚洲精品| 亚洲欧美日韩区| 亚洲熟妇无码久久精品| 一区二区成人在线视频| 色噜噜在线观看| 久久国产三级精品| 99久久免费观看| 国产亚洲一区| 亚洲va男人天堂| 亚洲美女炮图| 精品国内自产拍在线观看| www黄色网址| 欧美性xxxxxxxxx| 黄色精品视频在线观看| 成人久久久精品乱码一区二区三区| 欧美成人xxxxx| 婷婷丁香综合| 蜜桃久久影院| 色呦呦在线观看视频| 亚洲电影免费观看高清| 国产精品无码粉嫩小泬| 亚洲综合丁香婷婷六月香| 三级网站在线免费观看| 国产麻豆精品theporn| 69堂免费视频| 中文字幕一区二区三区乱码图片 | 国产伦精品一区二区三区88av| 欧美一级网站| 精品日韩在线播放| 亚洲成aⅴ人片久久青草影院| 成人欧美一区二区三区在线 | 91亚色免费| 中文字幕av一区二区三区佐山爱| 美女啪啪无遮挡免费久久网站| 青青国产在线| 欧美不卡一区二区| 亚洲特级黄色片| 色婷婷综合久色| 久久久久久久黄色| 国产精品白丝在线| 美女洗澡无遮挡| 成人午夜免费av| 视频二区在线播放| 性伦欧美刺激片在线观看| 黄色a级片免费看| 久久影院一区| 日韩久久久久久久| 国产精品午夜av| 444亚洲人体| 日韩精品第二页| 国产精品高潮呻吟久久av无限 | 日本女人性视频| 久久91精品国产91久久小草| 国产91对白刺激露脸在线观看| 国产精品九九| 天天爱天天做天天操| 青青草原综合久久大伊人精品 | 97电影在线| 亚洲天天在线日亚洲洲精| 日本波多野结衣在线| 欧美一卡二卡在线观看| 91片黄在线观看喷潮| 在线观看91视频| 手机在线看片1024| 欧美视频裸体精品| 六月丁香激情综合| 精品久久在线播放| 成人毛片18女人毛片| 偷拍日韩校园综合在线| 国产在线一区视频| 亚洲在线观看免费| 久久久久久激情| 亚洲成人资源网| 精品在线播放视频| 大桥未久av一区二区三区| 成人在线免费看视频| 五月天视频一区| 色婷婷av国产精品| 午夜精品在线视频一区| 日韩av免费网址| 欧美日韩国产一区二区三区| wwwxxx亚洲| 色视频欧美一区二区三区| 台湾佬中文在线| 欧美伊人久久久久久久久影院 | 欧美成人精品一区二区免费看片 | 丝袜美腿精品国产二区| 日本精品在线| 欧美激情视频播放| 欧美a级在线观看| 国产精品va在线播放| 国产精品伦一区二区| 成人免费在线视频网站| 91亚洲无吗| 免费看国产精品一二区视频| 国产一区二区三区网| 亚洲不卡1区| 日韩精品一区二区久久| 中文字幕一区二区三区四区五区人| 中文字幕日韩一区二区不卡| 国产婷婷一区二区三区| 天堂成人国产精品一区| 色91精品久久久久久久久| 国产91丝袜在线播放0| aaaaa一级片| 国产精品福利一区二区三区| 久久国产精品波多野结衣| 精品久久香蕉国产线看观看亚洲 | 亚洲成人中文字幕| 美州a亚洲一视本频v色道| 日韩中文字幕在线精品| 成全电影大全在线观看| 国产成人高清激情视频在线观看| 日韩黄色碟片| 久久久综合亚洲91久久98| 日韩视频在线观看| 91精品国产91久久久久麻豆 主演| 久久都是精品| 三级网站免费看| 久久精品视频一区| 少妇影院在线观看| 在线观看一区不卡| 亚洲精品视频专区| 这里只有精品视频在线| 高清电影在线免费观看| 国产精品男人的天堂| 欧美黑人做爰爽爽爽| www亚洲国产| 久久青草久久| 任你躁av一区二区三区| 国产精品第13页| 久久精品视频1| 日韩精品在线看片z| jizz在线免费观看| 97人人爽人人喊人人模波多| 91麻豆精品国产综合久久久 | 亚洲精选91| www,av在线| 国产精品人人做人人爽人人添| 国产小视频在线免费观看| 日韩欧美黄色影院| 免费高清完整在线观看| 国产999在线| 色爱av综合网| 99热亚洲精品| 国产成a人亚洲精品| 免费黄色激情视频| 91精品办公室少妇高潮对白| 色欲久久久天天天综合网| 欧美伦理91i| 国产精品国产三级在线观看| 天堂一区二区三区| 性欧美精品高清| 精品一区二区视频在线观看| 一区二区久久久久| 国产99久久九九精品无码免费| 日韩一区二区三区在线播放| 欧美极度另类| 欧美xxxx黑人又粗又长精品| 亚洲茄子视频| 日批在线观看视频| 亚洲高清视频的网址| 亚洲精品18p| 欧美激情在线狂野欧美精品| 国产不卡精品| 最新av网址在线观看| 激情国产一区二区| 99热在线观看精品| 欧美裸体一区二区三区| 91露出在线| 91精品免费看| 中文不卡在线| 国产乱国产乱老熟300部视频| 亚洲欧美激情在线| 国产成人久久精品77777综合 | 中文字幕亚洲欧美日韩2019| 日韩欧美精品电影| 日韩在线电影一区| 久久精品99久久久| 综合五月激情网| 欧美成人在线直播| 久草在线资源站资源站| 成人综合色站| 日韩视频在线一区二区三区| 成熟妇人a片免费看网站| 亚洲444eee在线观看| 四虎在线观看| 国产精品久久久久久久久久新婚| 成人国产精品一级毛片视频| www.超碰97.com| 日韩久久一区二区| 亚洲高清视频网站| 91av在线不卡| 第一sis亚洲原创| 伊人影院在线观看视频| 图片区小说区区亚洲影院| 高h视频在线| 3d动漫啪啪精品一区二区免费| 亚洲欧洲一区| 国产午夜福利一区| 欧美一区二区三区影视| 国产乱码在线| 日本一区二区在线视频| 精品一区二区三区在线播放| 久久久久成人精品无码| 亚洲欧美综合另类中字| 91国产一区| 69堂免费视频| 日韩一区中文字幕| 特级丰满少妇一级aaaa爱毛片| 国产91九色视频| 亚洲欧美偷拍自拍| 北岛玲一区二区| 在线91免费看| 精品丝袜在线| 自拍视频一区二区三区| 成人av网站在线| 一区二区三区日| 欧美在线一级视频| 91精品天堂福利在线观看| 国产视频久久久久久| 欧美群妇大交群中文字幕| av影视在线看| 免费看啪啪网站| 久久亚洲精品小早川怜子| av免费观看网址| 国产成人综合亚洲| 国产在线不卡|