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

聊聊Java知識點之反射

開發(fā) 后端
對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意方法和屬性。

[[376644]]

前言

今天說Java模塊內容:反射。

反射介紹

正常情況下,我們知曉我們要操作的類和對象是什么,可以直接操作這些對象中的變量和方法,比如一個User類:

  1. User user=new User(); 
  2. user.setName("Bob"); 

但是有的場景,我們無法正常去操作:

  • 只知道類路徑,無法直接實例化的對象。
  • 無法直接操作某個對象的變量和方法,比如私有方法,私有變量。
  • 需要hook系統(tǒng)邏輯,比如修改某個實例的參數(shù)。

等等情況。

所以我們就需要一種機制能讓我們去操作任意的類和對象。

這種機制,就是反射。簡單的說,反射就是:

對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意方法和屬性。

常用API舉例

先設定一個User類:

  1. package com.example.testapplication.reflection; 
  2. public class User { 
  3.     private int age; 
  4.     public String name
  5.  
  6.     public User() { 
  7.         System.out.println("調用了User()"); 
  8.     } 
  9.  
  10.     private User(int age, String name) { 
  11.         this.name = name
  12.         this.age = age; 
  13.         System.out.println("調用了User(age,name)"+"__age:"+age+"__name:"+name); 
  14.     } 
  15.  
  16.     public User(String name) { 
  17.         this.name = name
  18.         System.out.println("調用了User(name)"+"__name:"+name); 
  19.     } 
  20.  
  21.     private String getName() { 
  22.         System.out.println("調用了getName()"); 
  23.         return this.name
  24.     } 
  25.  
  26.     private String setName(String name) { 
  27.      this.name = name
  28.         System.out.println("調用了setName(name)__"+name); 
  29.         return this.name
  30.     } 
  31.  
  32.     public int getAge() { 
  33.         System.out.println("調用了getAge()"); 
  34.         return this.age; 
  35.     }     

獲取Class對象

  • 主要有三種方法獲取Class對象:
  • 根據(jù)類路徑獲取類對象
  • 直接獲取

實例對象的getclass方法

  1. //1、根據(jù)類路徑獲取類對象 
  2. try { 
  3.     Class clz = Class.forName("com.example.testapplication.reflection.User"); 
  4. } catch (ClassNotFoundException e) { 
  5.     e.printStackTrace(); 
  6.  
  7. //2、直接獲取 
  8. Class clz = User.class; 
  9.  
  10. //3、對象的getclass方法 
  11. Class clz = new User().getClass(); 

獲取類的構造方法

1、獲取類所有構造方法

  1. Class clz = User.class; 
  2. //獲取所有構造函數(shù)(不包括私有構造方法) 
  3. Constructor[] constructors1 = clz.getConstructors(); 
  4. //獲取所有構造函數(shù)(包括私有構造方法) 
  5. Constructor[] constructors2 = clz.getDeclaredConstructors(); 

2、獲取類的單個構造方法

  1. try { 
  2.        //獲取無參構造函數(shù) 
  3.        Constructor constructor1 = clz.getConstructor(); 
  4.  
  5.        //獲取參數(shù)為String的構造函數(shù) 
  6.        Constructor constructor2 =clz.getConstructor(String.class); 
  7.  
  8.        //獲取參數(shù)為int,String的構造函數(shù) 
  9.        Class[] params = {int.class,String.class}; 
  10.        Constructor constructor3 =clz.getDeclaredConstructor(params); 
  11.    } catch (NoSuchMethodException e) { 
  12.        e.printStackTrace(); 
  13.    } 

需要注意的是,User(int age, String name)為私有構造方法,所以需要使用getDeclaredConstructor獲取。

調用類的構造方法生成實例對象

1、調用Class對象的newInstance方法

這個方法只能調用無參構造函數(shù),也就是Class對象的newInstance方法不能傳入?yún)?shù)。

  1. Object user = clz.newInstance(); 

2、調用Constructor對象的newInstance方法

  1. Class[] params = {int.class,String.class}; 
  2. Constructor constructor3 =clz.getDeclaredConstructor(params); 
  3. constructor3.setAccessible(true); 
  4. constructor3.newInstance(22,"Bob"); 

這里要注意下,雖然getDeclaredConstructor能獲取私有構造方法,但是如果要調用這個私有方法,需要設置setAccessible(true)方法,否則會報錯:

  1. can not access a member of class com.example.testapplication.reflection.User with modifiers "private" 

獲取類的屬性(包括私有屬性)

  1. Class clz = User.class; 
  2. Field field1 = clz.getField("name"); 
  3. Field field2 = clz.getDeclaredField("age"); 

同樣的,getField獲取public類變量,getDeclaredField可以獲取所有變量(包括私有變量屬性)。

所以一般直接用getDeclaredField即可。

修改實例的屬性

接上例,獲取類的屬性后,可以去修改類實例的對應屬性,比如我們有個user的實例對象,我們來修改它的name和age。

  1. //修改namenamepublic屬性 
  2. Class clz = User.class; 
  3. Field field1 = clz.getField("name"); 
  4. field1.set(user,"xixi"); 
  5.  
  6. //修改age,age為private屬性 
  7. Class clz = User.class; 
  8. Field field2 = clz.getDeclaredField("age"); 
  9. field2.setAccessible(true); 
  10. field2.set(user,123); 

獲取類的方法(包括私有方法)

  1.   //獲取getName方法 
  2.    Method method1 = clz.getDeclaredMethod("getName"); 
  3. //獲取setName方法,帶參數(shù) 
  4.    Method method2 = clz.getDeclaredMethod("setName", String.class); 
  5.    //獲取getage方法 
  6.    Method method3 = clz.getMethod("getAge"); 

調用實例的方法

  1. method1.setAccessible(true); 
  2. Object name = method1.invoke(user); 
  3.  
  4.  
  5. method2.setAccessible(true); 
  6. method2.invoke(user"xixi"); 
  7.  
  8. Object age = method3.invoke(user); 

反射優(yōu)缺點

雖然反射很好用,增加了程序的靈活性,但是也有他的缺點:

  • 性能問題。由于用到動態(tài)類型(運行時才檢查類型),所以反射的效率比較低。但是對程序的影響比較小,除非對性能要求比較高。所以需要在兩者之間平衡。
  • 不夠安全。由于可以執(zhí)行一些私有的屬性和方法,所以可能會帶來安全問題。
  • 不易讀寫。當然這一點也有解決方案,比如jOOR庫,但是不適用于Android定義為final的字段。

Android中的應用

插件化(Hook)

Hook 技術又叫做鉤子函數(shù),在系統(tǒng)沒有調用該函數(shù)之前,鉤子程序就先捕獲該消息,鉤子函數(shù)先得到控制權,這時鉤子函數(shù)既可以加工處理(改變)該函數(shù)的執(zhí)行行為,還可以強制結束消息的傳遞。

在插件化中,我們需要找到可以hook的點,然后進行一些插件的工作,比如替換Activity,替換mH等等。這其中就用到大量反射的知識,這里以替換mH為例:

  1. // 獲取到當前的ActivityThread對象 
  2. Class<?> activityThreadClass = Class.forName("android.app.ActivityThread"); 
  3. Field currentActivityThreadField = activityThreadClass.getDeclaredField("sCurrentActivityThread"); 
  4. currentActivityThreadField.setAccessible(true); 
  5. Object currentActivityThread = currentActivityThreadField.get(null); 
  6.  
  7. //獲取這個對象的mH 
  8. Field mHField = activityThreadClass.getDeclaredField("mH"); 
  9. mHField.setAccessible(true); 
  10. Handler mH = (Handler) mHField.get(currentActivityThread); 
  11.  
  12.  
  13. //替換mh為我們自己的HandlerCallback 
  14. Field mCallBackField = Handler.class.getDeclaredField("mCallback"); 
  15. mCallBackField.setAccessible(true); 
  16. mCallBackField.set(mH, new MyActivityThreadHandlerCallback(mH)); 

動態(tài)代理

動態(tài)代理的特點是不需要提前創(chuàng)建代理對象,而是利用反射機制在運行時創(chuàng)建代理類,從而動態(tài)實現(xiàn)代理功能。

  1. public class InvocationTest implements InvocationHandler { 
  2.     // 代理對象(代理接口) 
  3.     private Object subject; 
  4.  
  5.     public InvocationTest(Object subject) { 
  6.         this.subject = subject; 
  7.     } 
  8.     @Override 
  9.     public Object invoke(Object object, Method method, Object[] args) 
  10.             throws Throwable { 
  11.         //代理真實對象之前 
  12.         Object obj = method.invoke(subject, args); 
  13.         //代理真實對象之后 
  14.         return obj; 
  15.     } 

三方庫(注解)

我們可以發(fā)現(xiàn)很多庫都會用到注解,而獲取注解的過程也會有反射的過程,比如獲取Activity中所有變量的注解:

  1. public void getAnnotation(Activity activity){ 
  2.     Class clazz = activity.getClass(); 
  3.     //獲得activity中的所有變量 
  4.     Field[] fields = clazz.getDeclaredFields(); 
  5.     for (Field field : fields) { 
  6.         field.setAccessible(true); 
  7.         //獲取變量上加的注解 
  8.         MyAnnotation test = field.getAnnotation(MyAnnotation.class); 
  9.         //... 
  10.     } 

這種通過反射處理注解的方式稱作運行時注解,也就是程序運行狀態(tài)的時候才會去處理注解。但是上文說過了,反射會在一定程度上影響到程序的性能,所以還有一種處理注解的方式:編譯時注解。

所用到的注解處理工具是APT。

APT是一種注解處理器,可以在編譯時進行掃描和處理注解,然后生成java代碼文件,這種方法對比反射就能比較小的影響到程序的運行性能。

這里就不說APT的使用了,下次會專門有章節(jié)提到~

Android體系架構

Android體系架構:https://github.com/JiMuzz/Android-Architecture

參考

https://www.jianshu.com/p/3382cc765b39

https://segmentfault.com/a/1190000015860183

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

 

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

2021-04-07 07:48:00

測試開發(fā)Java反射Spring

2020-10-26 10:40:31

Axios前端攔截器

2018-01-25 12:50:33

數(shù)據(jù)庫OracleROWNUM

2025-05-07 08:55:00

2025-07-09 09:05:00

2016-05-30 17:31:34

Spring框架

2011-04-15 12:25:21

BGP路由

2010-08-17 14:56:00

HCNE認證

2022-12-13 08:23:25

CSS前端漸變

2021-12-30 08:17:27

Springboot數(shù)據(jù)訪問DataSourceB

2011-01-18 11:41:26

程序員

2011-01-07 10:54:39

程序員

2011-01-14 11:03:32

程序員

2011-01-11 11:37:03

程序員

2010-12-23 11:18:16

程序員

2010-12-27 10:08:22

程序員

2010-12-30 10:18:54

程序員

2011-01-05 14:53:53

程序員

2011-01-28 10:53:18

程序員

2010-12-24 10:23:50

程序員
點贊
收藏

51CTO技術棧公眾號

一区二区三区国产在线观看| 久久久久久久久97黄色工厂| 久久综合色影院| 久久久久亚洲av无码麻豆| 黄页在线观看免费| 91老师国产黑色丝袜在线| 国产精品久久一| 久久久精品99| 国产成人影院| 日韩视频在线一区二区| 欧洲黄色一级视频| 69久久精品| caoporn国产精品| 国产日韩精品视频| 国产精品第108页| 成人在线免费观看91| 日韩午夜在线播放| 欧美性猛交久久久乱大交小说| 成人免费看片| 国产清纯白嫩初高生在线观看91| http;//www.99re视频| 自拍偷拍福利视频| 亚洲精品麻豆| 麻豆一区二区在线观看| 亚洲a v网站| 99久久99九九99九九九| 一本一道久久a久久精品综合蜜臀 一本一道综合狠狠老 | 中文字幕免费在线看线人动作大片| 天堂va欧美ⅴa亚洲va一国产| 色综合久久综合| 青青在线免费观看| 黄色网在线看| 国产嫩草影院久久久久| 国产日韩三区| 性一交一乱一透一a级| 久久99久久99小草精品免视看| 2025国产精品视频| 精品无码人妻一区二区三区| 亚洲va在线| 中文字幕视频在线免费欧美日韩综合在线看 | 亚洲第一二三四五区| www.超碰97.com| 国产成人精品一区二区三区免费| 色综合久久久网| 亚洲欧洲日产国码无码久久99| 欧美hdxxx| 一区二区三区四区亚洲| 中文字幕精品—区二区日日骚| 成人激情电影在线看| 久久久久久久久久久久久夜| 美女被啪啪一区二区| 午夜视频免费在线| av资源站一区| 精品日产一区2区三区黄免费| 成人小说亚洲一区二区三区| 国产大陆精品国产| 不卡一区二区三区视频| 懂色av一区二区三区四区| 国产精品综合av一区二区国产馆| 亚洲va码欧洲m码| 国产视频在线观看视频| 国产精品羞羞答答xxdd| 99蜜桃在线观看免费视频网站| 精品黑人一区二区三区国语馆| 黑人巨大精品欧美黑白配亚洲| 91网站在线免费观看| jlzzjlzzjlzz亚洲人| 国产99一区视频免费| 国产精品久久久久免费 | 精品视频—区二区三区免费| 欧美 日本 国产| 欧美男同视频网| 中文字幕亚洲欧美日韩高清| 天天看天天摸天天操| 欧美久久一级| 2019亚洲日韩新视频| 亚洲中文字幕无码爆乳av| 日本一区中文字幕| 成人欧美一区二区三区黑人| 精品国产无码一区二区| 91蜜桃在线免费视频| 日韩欧美在线观看强乱免费| 麻豆tv入口在线看| 亚洲成av人片在线| 黄色片视频在线播放| 24小时成人在线视频| 精品欧美一区二区三区精品久久| 中文字幕5566| 久久综合av| 久久久久久久久久久人体| www.国产com| 精品一区二区成人精品| 国产精品视频入口| 国模精品一区二区| 亚洲精品欧美在线| 国产免费毛卡片| 国产精品一站二站| 亚洲欧美日韩精品久久奇米色影视| 国产精品www爽爽爽| 欧美精品网站| 国产精品吴梦梦| 欧美一级一区二区三区| 亚洲国产成人午夜在线一区| 日韩专区第三页| 欧美xoxoxo| 日韩欧美一区二区免费| av中文字幕免费观看| 欧美日韩综合| 国产精品久久久久久搜索| 亚洲国产精品无码久久| 欧美激情一区在线| 久久综合久久网| 国产伊人久久| 国产视频精品va久久久久久| 午夜爽爽爽男女免费观看| 欧美中文日韩| www.成人av.com| 天天综合视频在线观看| 精品久久久久久久久久久久久| 亚洲制服中文字幕| 国产不卡av一区二区| 久久久久久久久91| 一级片在线免费观看视频| 91麻豆swag| 2019日韩中文字幕mv| 日本一区二区三区中文字幕| 亚洲精选一区二区| 久操视频免费在线观看| 国产一区二区在线影院| 亚洲aⅴ天堂av在线电影软件| 国产色播av在线| 精品国产乱码久久久久久蜜臀| 国产精品精品软件男同| 日本网站在线观看一区二区三区| 久久久精品动漫| 欧美午夜大胆人体| 欧美高清激情brazzers| 五月天婷婷丁香网| 日韩国产精品91| 欧美少妇一区| 另类图片综合电影| 精品亚洲一区二区| 国产做受高潮漫动| 成人黄色大片在线观看| 97中文字幕在线| 亚洲精品福利| 欧美激情欧美激情在线五月| 国产99久一区二区三区a片 | 高清成人在线观看| 成人手机在线播放| 国产精品久久久久久久久久久久久久久 | 国产成人av网| 第九色区av在线| 欧美丝袜丝交足nylons图片| 国产欧美一区二区三区在线观看视频| 老司机精品视频网站| 欧美精品v日韩精品v国产精品| 午夜不卡影院| 亚洲色图18p| 波多野结衣一二区| 国产精品久久久久一区二区三区共| 天天操天天爱天天爽| 欧美日韩中文字幕一区二区三区| 国产精品视频网| 伦xxxx在线| 精品国产乱码久久久久久浪潮| 国产精品第72页| 久久久久久久av麻豆果冻| 欧美少妇性生活视频| 成人情趣视频网站| 91午夜在线播放| 欧美a级在线观看| 亚洲欧美在线看| 亚洲一卡二卡在线| 一区二区三区不卡视频在线观看| 95视频在线观看| 免费在线亚洲欧美| 亚洲精品国产精品国自产观看 | 日韩精品欧美精品| 亚洲精品中文字幕在线| 欧美中文高清| 啪一啪鲁一鲁2019在线视频| av在线1区2区| 欧美本精品男人aⅴ天堂| 六月丁香在线视频| 国产欧美日韩精品一区| 久久综合在线观看| 国产日韩一区二区三区在线| 亚洲图片小说在线| 51精品国产| 国产精品男女猛烈高潮激情| 欧美性爽视频| 伊人精品在线观看| 日本美女一级视频| 欧美日韩中文另类| 日本少妇裸体做爰| 国产精品久久久久影院老司| 国产精品久久久久久亚洲色| 美女诱惑一区二区| 国产精品国产亚洲精品看不卡| 日韩欧美在线中字| 精品婷婷色一区二区三区蜜桃| 欧美在线一级| 18久久久久久| 怡红院红怡院欧美aⅴ怡春院| 亚洲人成绝费网站色www| www.97超碰| 欧美午夜片在线观看| 日本少妇激情舌吻| 亚洲人成网站色在线观看| 色欲av无码一区二区三区| 国产精品系列在线播放| www亚洲成人| 国产农村妇女精品一区二区| 日韩精品第1页| 欧美精品系列| 蜜桃传媒视频第一区入口在线看| 欧美久久亚洲| 国产精品91久久久久久| 成a人片在线观看| 中文字幕在线成人| 黄色一级大片在线免费看国产| 欧美剧在线免费观看网站| 国产乡下妇女做爰| 亚洲激情综合网| 欧美性x x x| 中文字幕免费观看一区| 国产精品成人一区二区三区电影毛片| 小毛片在线观看| 一区二区三区成人精品| a级片一区二区| 亚洲成人最新网站| 一区二区视频在线免费| 成人三级视频| 亚洲国产一区在线| 欧美精选一区二区三区| 欧美久久久久久一卡四| 欧美变态网站| 精品日本一区二区三区| 美女午夜精品| 精品一区2区三区| 好吊妞国产欧美日韩免费观看网站| 亚洲xxxx视频| 欧美视频精品全部免费观看| 成人两性免费视频| 伊人久久综合网另类网站| 国产日韩在线精品av| 成人看片毛片免费播放器| 国产精品69精品一区二区三区| 欧美va在线观看| 国产精品草莓在线免费观看 | 国产三级国产精品| 99久久久精品免费观看国产蜜| 国产精品成人无码专区| 波多野结衣中文字幕一区| 污污内射在线观看一区二区少妇| av网站免费线看精品| av黄色一级片| 国产婷婷色一区二区三区四区| 欧美人与性囗牲恔配| 国产精品欧美一区二区三区| 亚洲欧美另类日本| 亚洲私人影院在线观看| 久草成人在线视频| 午夜久久电影网| 国产精品熟女视频| 欧美日韩国产首页在线观看| 国产一区二区小视频| 日韩精品专区在线影院重磅| 日本加勒比一区| 国产一级揄自揄精品视频| 欧美jizzhd69巨大| 欧美激情中文网| 免费电影日韩网站| 国产欧美日韩91| 6080成人| 日本在线播放一区| 91精品国产91久久综合| 国产在线播放观看| 免费成人在线网站| 久久黄色一级视频| 久久你懂得1024| 波多野结衣爱爱视频| 欧美色播在线播放| 亚洲在线视频播放| 亚洲电影av在线| 国产特黄在线| 欧美国产乱视频| 国产电影一区二区三区爱妃记| 亚洲一区二区在线| 国产成人精品三级高清久久91| 特级毛片在线免费观看| 99这里有精品| 亚洲精品乱码久久久久久动漫| 91免费看`日韩一区二区| 久艹在线观看视频| 欧美日韩免费看| 国产精品久久久久久在线| 亚洲精品国产欧美| 日日夜夜精品一区| 亚洲18私人小影院| 四虎地址8848精品| 美女黄毛**国产精品啪啪| 你懂的网址国产 欧美| 日本www高清视频| 成人网在线免费视频| 啪啪一区二区三区| 欧美日韩国产精品一区二区不卡中文| 国产精品免费无遮挡| 亚洲男人天堂2024| 在线观看电影av| 国产欧美日韩视频| 一本久久青青| 自拍日韩亚洲一区在线| 国产在线视频精品一区| 三年中国中文观看免费播放| 精品久久久久久中文字幕大豆网| 97成人在线观看| 国产一区二区三区在线看| 538在线观看| www.一区二区三区| 亚洲影视一区| 亚洲激情在线看| 国产精品丝袜一区| 丁香社区五月天| 日韩精品在线观看一区| ****av在线网毛片| 99精彩视频在线观看免费| 欧美a级片视频| 日韩高清第一页| 国产精品午夜免费| 成年人晚上看的视频| 亚洲欧美制服丝袜| 久草在线中文最新视频| 国产精品一区视频| 在线精品福利| 稀缺呦国内精品呦| 一区二区三区日韩在线观看| 国产人妻精品一区二区三区| 日韩中文字幕在线视频播放| 巨胸喷奶水www久久久免费动漫| 欧美久久综合性欧美| 视频一区二区中文字幕| 美女洗澡无遮挡| 在线观看视频一区二区| 国产黄在线观看免费观看不卡| 欧洲日本亚洲国产区| 精品黄色一级片| 国产精品视频中文字幕| 亚洲欧美怡红院| 97超碰人人草| 欧美另类极品videosbest最新版本 | 在线综合亚洲| 无码人妻精品一区二区三应用大全| 五月激情综合网| 欧美成人综合在线| 国产精品成人国产乱一区| 日韩av在线播放网址| 超碰成人在线播放| 亚洲欧美福利一区二区| www国产一区| 91精品国产高清久久久久久久久 | 亚洲国产成人私人影院tom| 亚洲字幕av一区二区三区四区| 精品精品国产国产自在线| 日韩在线观看中文字幕| 青青青免费在线| 国产午夜一区二区三区| 一级做a爱片久久毛片| 欧美疯狂做受xxxx高潮| 欧美理伦片在线播放| 久久九九国产视频| 国产精品国产自产拍在线| 国产成人精品免费看视频| 高清亚洲成在人网站天堂| 亚洲丝袜啪啪| 国产乱女淫av麻豆国产| 夜夜精品视频一区二区 | 男人天堂成人在线| 中文字幕中文字幕一区二区| 亚洲欧美强伦一区二区| 日韩暖暖在线视频| 久久精品免费一区二区三区| 性色av蜜臀av浪潮av老女人| 欧美怡红院视频| 色综合999| 日本一区二区三不卡| 国产精品一区二区x88av| 日韩字幕在线观看| 色婷婷av一区二区三区在线观看| 成人线上播放| 国产精品拍拍拍| 亚洲电影第三页| h网站视频在线观看| 国产伦精品一区二区三区免费视频| 首页国产欧美久久| 久久久久久蜜桃| 综合网中文字幕| 琪琪久久久久日韩精品 | 欧美日韩午夜电影网|