日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java反射技術詳解及實例解析

瀏覽:34日期:2022-08-29 11:20:07

前言

相信很多人都知道反射可以說是Java中最強大的技術了,它可以做的事情太多太多,很多優秀的開源框架都是通過反射完成的,比如最初的很多注解框架,后來因為java反射影響性能,所以被運行時注解APT替代了,java反射有個開源框架jOOR相信很多人都用過,不過我們還是要學習反射的基礎語法,這樣才能自己寫出優秀的框架,當然這里所講的反射技術,是學習Android插件化技術、Hook技術等必不可少的!

一、基本反射技術

1.1 根據一個字符串得到一個類

getClass方法

String name = 'Huanglinqing'; Class c1 = name.getClass(); System.out.println(c1.getName());

打印結果如下:

Java反射技術詳解及實例解析

Class.forName

比如我們獲取java.lang.String的類名

String name = 'java.lang.String'; Class c1 = null; try { c1 = Class.forName(name); System.out.println(c1.getName()); } catch (ClassNotFoundException e) { }

這里也通過捕獲異常,因為我們傳的這個字符串可能不合法,字符串合法命名是類的命名空間和類的名稱組成

打印結果如下:

Java反射技術詳解及實例解析

我們還可以通過c1.getSuperclass()獲取到他的父類

Type屬性

基本類型都有type屬性,可以得到這個基本類型的類型,比如:

Class c1 = Boolean.TYPE;Class c2 = Byte.TYPE;Class c3 = Float.TYPE;Class c4 = Double.TYPE;

停停停!這些東西有啥子用,如此雞肋! 別急,一切都是為后續做準備。

二、獲取類的成員

當類中方法定義為私有的時候我們能調用?不能!當變量是私有的時候我們能獲取嗎?不能!但是反射可以,比如源碼中有你需要用到的方法,但是那個方法是私有的,這個時候你就可以通過反射去執行這個私有方法,并且獲取私有變量。

獲取類的構造函數

為了便于測試,我們定義一個Test類,Test類如下:(省略get和set方法)

Test類中我們定義是三個私有變量,生成兩個公有的含參構造方法和一個私有的含參構造方法以及一個公有的無參構造方法。

public class Test { private int age; private String name; private int testint; public Test(int age) { this.age = age; } public Test(int age, String name) { this.age = age; this.name = name; } private Test(String name) { this.name = name; } public Test() { }

下面我們通過反射獲取這些構造方法

獲取類的所有構造方法

Test test = new Test(); Class c4 = test.getClass(); Constructor[] constructors ; constructors = c4.getDeclaredConstructors();

通過getDeclaredConstructors可以返回類的所有構造方法,返回的是一個數組因為構造方法可能不止一個,通過getModifiers可以得到構造方法的類型,getParameterTypes可以得到構造方法的所有參數,返回的是一個Class數組,所以我們如果想獲取所有構造方法以及每個構造方法的參數類型,可以有如下代碼:

for (int i = 0; i < constructors.length; i++) { System.out.print(Modifier.toString(constructors[i].getModifiers()) + '參數:'); Class[] parametertypes = constructors[i].getParameterTypes(); for (int j = 0; j < parametertypes.length; j++) { System.out.print(parametertypes[j].getName() + ' '); } System.out.println(''); }

運行結果如下所示:

Java反射技術詳解及實例解析

這樣我們就得到了類中所有構造方法和構造方法中的參數,那么我們如何獲取特定的構造方法呢?

獲取類中特定的構造方法

我們可以通過getConstructors方法獲取類中 所有的public類型的構造方法,代碼和上面一樣就不演示了。

我們可以通過getDeclaredConstructor()方法傳參獲取特定參數類型的構造方法,這里注意是getDeclaredConstructor()不是 getDeclaredConstructors() ,所以返回的是一個Class對象而不是一個Class數組。

獲取無參構造方法直接不傳參數,如下所示:

try { constructors = c4.getDeclaredConstructor(); System.out.print(Modifier.toString(constructors.getModifiers()) + ); } catch (NoSuchMethodException e) { e.printStackTrace(); }

這里要進行異常捕獲,因為可能不存在對應的構造方法,打印結果如下:

Java反射技術詳解及實例解析

如果我們想獲取有兩個參數分別為int和String類型的構造方法,代碼如下:

Class[] p = {int.class,String.class}; try { constructors = c4.getDeclaredConstructor(p); System.out.print(Modifier.toString(constructors.getModifiers()) + '參數:'); Class[] parametertypes = constructors.getParameterTypes(); for (int j = 0; j < parametertypes.length; j++) { System.out.print(parametertypes[j].getName() + ' '); } } catch (NoSuchMethodException e) { e.printStackTrace(); }

這里我們同樣打印出構造方法的參數:

Java反射技術詳解及實例解析

調用構造方法

從這里開始慢慢到了關鍵的一步,得到類的實例,我們主要借助于newInstance方法,為了方便演示我們將測試類的兩個構造方法打印出來.

public Test(int age, String name) { this.age = age; this.name = name; System.out.println('hello' + name + 'i am' + age); } private Test(String name) { this.name = name; System.out.println('My Name is' + name); }

我們先來調用public的方法,如下所示:

Class[] p = {int.class,String.class}; constructors = c4.getDeclaredConstructor(p); constructors.newInstance(24,'HuangLinqing');

運行打印結果如下:

Java反射技術詳解及實例解析

那么調用私有構造方法呢,和上面一樣,只是我們要設置constructors.setAccessible(true);代碼如下:

Class[] p = {String.class}; constructors = c4.getDeclaredConstructor(p); constructors.setAccessible(true); constructors.newInstance('HuangLinqing');

打印結果如下:

Java反射技術詳解及實例解析

調用類的私有方法

如何調用類中的私有方法呢,我們先在測試類中編寫一個測試的私有方法 如下:

private void welcome(String tips){ System.out.println(tips); }

我們知道如果我們要正常的調用類的方法都是通過類.方法調用,所以我們調用私有方法也需要得到類的實例,而我們上面newInstace已經得到了類的實例,這樣就好辦了。

Class[] p4 = {String.class}; Method method = c4.getDeclaredMethod('welcome',p4); method.setAccessible(true);

我們首先通過 getDeclaredMethod方法獲取到這個私有方法,第一個參數是方法名,第二個參數是參數類型

然后通過invoke方法執行,invoke需要兩個參數一個是類的實例,一個是方法參數。

Class[] p4 = {String.class}; Method method = c4.getDeclaredMethod('welcome',p4); method.setAccessible(true); Object arg1s[] = {'歡迎關注代碼男人技術公眾號'}; method.invoke(test,arg1s);

test類的實例當不能new 獲取的時候我們也可以通過反射獲取,就是上面的newInstance方法。打印結果如下:

Java反射技術詳解及實例解析

獲取類的私有字段并修改值

看到這里你可能會說,有了set方法,什么私有不私有,test.set不就可以了,但是這里要注意我們是沒有辦法得到這個類的實例的,要不然都可以得到實例就沒有反射一說了。我們在通過反射得到類的實例之后先獲取字段:

Field field = c4.getDeclaredField('name');field.setAccessible(true);field.set(o,'代碼男人');

o是我們上面通過反射構造方法獲取的實例, 打印field.get(o).toString()的值如下:

Java反射技術詳解及實例解析

不過要注意的是我們修改了name的值只對當前的實例對象有效。

Java的基本反射語法就是這樣了,歡迎加入技術群一起探討!

最后反射封裝類如下:

package jnidemo.hlq.com.hookdemo; import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method; /** * @author Huanglinqing * @date 2019/4/28 */ public class Reflex { /** * 獲取無參構造函數 * @param className * @return */ public static Object createObject(String className) { Class[] pareTyples = new Class[]{}; Object[] pareVaules = new Object[]{}; try { Class r = Class.forName(className); return createObject(r, pareTyples, pareVaules); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } /** * 獲取無參構造方法 * @param clazz * @return */ public static Object createObject(Class clazz) { Class[] pareTyple = new Class[]{}; Object[] pareVaules = new Object[]{}; return createObject(clazz, pareTyple, pareVaules); } /** * 獲取一個參數的構造函數 已知className * * @param className * @param pareTyple * @param pareVaule * @return */ public static Object createObject(String className, Class pareTyple, Object pareVaule) { Class[] pareTyples = new Class[]{pareTyple}; Object[] pareVaules = new Object[]{pareVaule}; try { Class r = Class.forName(className); return createObject(r, pareTyples, pareVaules); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } /** * 獲取單個參數的構造方法 已知類 * * @param clazz * @param pareTyple * @param pareVaule * @return */ public static Object createObject(Class clazz, Class pareTyple, Object pareVaule) { Class[] pareTyples = new Class[]{pareTyple}; Object[] pareVaules = new Object[]{pareVaule}; return createObject(clazz, pareTyples, pareVaules); } /** * 獲取多個參數的構造方法 已知className * @param className * @param pareTyples * @param pareVaules * @return */ public static Object createObject(String className, Class[] pareTyples, Object[] pareVaules) { try { Class r = Class.forName(className); return createObject(r, pareTyples, pareVaules); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } /** * 獲取構造方法 * * @param clazz * @param pareTyples * @param pareVaules * @return */ public static Object createObject(Class clazz, Class[] pareTyples, Object[] pareVaules) { try { Constructor ctor = clazz.getDeclaredConstructor(pareTyples); ctor.setAccessible(true); return ctor.newInstance(pareVaules); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取多個參數的方法 * @param obj * @param methodName * @param pareTyples * @param pareVaules * @return */ public static Object invokeInstanceMethod(Object obj, String methodName, Class[] pareTyples, Object[] pareVaules) { if (obj == null) { return null; } try { //調用一個private方法 //在指定類中獲取指定的方法 Method method = obj.getClass().getDeclaredMethod(methodName, pareTyples); method.setAccessible(true); return method.invoke(obj, pareVaules); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取一個參數的方法 * @param obj * @param methodName * @param pareTyple * @param pareVaule * @return */ public static Object invokeInstanceMethod(Object obj, String methodName, Class pareTyple, Object pareVaule) { Class[] pareTyples = {pareTyple}; Object[] pareVaules = {pareVaule}; return invokeInstanceMethod(obj, methodName, pareTyples, pareVaules); } /** * 獲取無參方法 * @param obj * @param methodName * @return */ public static Object invokeInstanceMethod(Object obj, String methodName) { Class[] pareTyples = new Class[]{}; Object[] pareVaules = new Object[]{}; return invokeInstanceMethod(obj, methodName, pareTyples, pareVaules); } /** * 無參靜態方法 * @param className * @param method_name * @return */ public static Object invokeStaticMethod(String className, String method_name) { Class[] pareTyples = new Class[]{}; Object[] pareVaules = new Object[]{}; return invokeStaticMethod(className, method_name, pareTyples, pareVaules); } /** * 獲取一個參數的靜態方法 * @param className * @param method_name * @param pareTyple * @param pareVaule * @return */ public static Object invokeStaticMethod(String className, String method_name, Class pareTyple, Object pareVaule) { Class[] pareTyples = new Class[]{pareTyple}; Object[] pareVaules = new Object[]{pareVaule}; return invokeStaticMethod(className, method_name, pareTyples, pareVaules); } /** * 獲取多個參數的靜態方法 * @param className * @param method_name * @param pareTyples * @param pareVaules * @return */ public static Object invokeStaticMethod(String className, String method_name, Class[] pareTyples, Object[] pareVaules) { try { Class obj_class = Class.forName(className); return invokeStaticMethod(obj_class, method_name, pareTyples, pareVaules); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 無參靜態方法 * @param method_name * @return */ public static Object invokeStaticMethod(Class clazz, String method_name) { Class[] pareTyples = new Class[]{}; Object[] pareVaules = new Object[]{}; return invokeStaticMethod(clazz, method_name, pareTyples, pareVaules); } /** * 一個參數靜態方法 * @param clazz * @param method_name * @param classType * @param pareVaule * @return */ public static Object invokeStaticMethod(Class clazz, String method_name, Class classType, Object pareVaule) { Class[] classTypes = new Class[]{classType}; Object[] pareVaules = new Object[]{pareVaule}; return invokeStaticMethod(clazz, method_name, classTypes, pareVaules); } /** * 多個參數的靜態方法 * @param clazz * @param method_name * @param pareTyples * @param pareVaules * @return */ public static Object invokeStaticMethod(Class clazz, String method_name, Class[] pareTyples, Object[] pareVaules) { try { Method method = clazz.getDeclaredMethod(method_name, pareTyples); method.setAccessible(true); return method.invoke(null, pareVaules); } catch (Exception e) { e.printStackTrace(); } return null; } public static Object getFieldObject(String className, Object obj, String filedName) { try { Class obj_class = Class.forName(className); return getFieldObject(obj_class, obj, filedName); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } public static Object getFieldObject(Class clazz, Object obj, String filedName) { try { Field field = clazz.getDeclaredField(filedName); field.setAccessible(true); return field.get(obj); } catch (Exception e) { e.printStackTrace(); } return null; } public static void setFieldObject(Class clazz, Object obj, String filedName, Object filedVaule) { try { Field field = clazz.getDeclaredField(filedName); field.setAccessible(true); field.set(obj, filedVaule); } catch (Exception e) { e.printStackTrace(); } } public static void setFieldObject(String className, Object obj, String filedName, Object filedVaule) { try { Class obj_class = Class.forName(className); setFieldObject(obj_class, obj, filedName, filedVaule); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Object getStaticFieldObject(String className, String filedName) { return getFieldObject(className, null, filedName); } public static Object getStaticFieldObject(Class clazz, String filedName) { return getFieldObject(clazz, null, filedName); } public static void setStaticFieldObject(String classname, String filedName, Object filedVaule) { setFieldObject(classname, null, filedName, filedVaule); } public static void setStaticFieldObject(Class clazz, String filedName, Object filedVaule) { setFieldObject(clazz, null, filedName, filedVaule); }}

到此這篇關于Java反射技術詳解及實例解析的文章就介紹到這了,更多相關Java反射技術示例詳解內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
四虎在线精品| 中文字幕av一区二区三区人| 亚洲精品观看| 免费观看在线色综合| 婷婷激情久久| 日韩亚洲国产欧美| 免费成人在线视频观看| 蜜桃视频在线观看一区二区| 在线看片一区| 国产欧美一级| 欧美男人天堂| 国产女优一区| 国产日本久久| www.九色在线| 激情欧美一区二区三区| 日韩视频在线一区二区三区 | 国产精品婷婷| 日韩va亚洲va欧美va久久| 日韩1区2区日韩1区2区| 国产福利亚洲| 亚洲精品88| 黄色欧美日韩| 最新国产精品| 久久久久伊人| 99久久久久| 尤物在线精品| 青青国产91久久久久久| 国产伦精品一区二区三区在线播放 | 国产精区一区二区| 欧美日韩午夜电影网| 青青草视频一区| 久久精品999| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 亚洲伊人精品酒店| 日韩精品一区二区三区免费视频| 国产精品17p| 精品久久视频| 夜久久久久久| 亚洲精品乱码| 日韩理论视频| 狠狠久久婷婷| 国产精品欧美日韩一区| caoporn视频在线| 先锋亚洲精品| 日韩1区2区3区| 日韩av字幕| 丁香婷婷久久| 欧美精品一区二区久久| 国产日产一区| 亚洲伦乱视频| 91成人福利| 中文在线资源| 亚洲久草在线| 牛牛精品成人免费视频| 久久国产中文字幕| 蜜桃视频在线观看一区| 精品精品国产三级a∨在线| 999国产精品999久久久久久| 亚洲精品乱码日韩| 久久精品国产99国产| 亚洲综合不卡| 精品一区二区三区视频在线播放| 91久久中文| 国产日韩在线观看视频| 激情六月综合| 欧美久久亚洲| 亚洲激情av| 国产精品久久乐| 国产精品毛片在线| 欧美自拍一区| 最新亚洲激情| 国产精品麻豆成人av电影艾秋| 2023国产精品久久久精品双| 日韩av一二三| 香蕉成人av| 亚洲精品福利| 三上悠亚国产精品一区二区三区| 日韩中文字幕一区二区三区| 欧美黄色精品| 麻豆9191精品国产| 日韩二区在线观看| 成人av二区| 国产日产一区| 国产成人黄色| 国产欧美日韩综合一区在线播放| 日韩精品2区| 国产亚洲观看| 国产精品99视频| 日韩和欧美一区二区| 91精品蜜臀一区二区三区在线| 久久香蕉网站| 深夜福利亚洲| 免费一级片91| 久久一级电影| 国产激情在线播放| 91精品国产自产在线丝袜啪| 国产亚洲欧洲| 国产美女高潮在线观看| 久久wwww| 亚洲在线久久| 久久av在线| 国产va在线视频| 久久精品国产免费| 日本视频一区二区| 亚洲综合色婷婷在线观看| 99久精品视频在线观看视频| а√天堂8资源中文在线| 国产欧美日韩在线观看视频| 欧美日本一区| 亚洲视频国产精品| 视频一区在线播放| 久久一级电影| 99成人超碰| 精品视频网站| 鲁大师精品99久久久| 日韩高清电影免费| 日日夜夜免费精品视频| 欧美日韩四区| 国产精品人人爽人人做我的可爱| 日韩大片在线播放| 久久精品123| 精品国产免费人成网站| 日韩欧美午夜| 久久精品国产999大香线蕉| 麻豆久久久久久久| 欧美日韩夜夜| 国产高清日韩| 免费精品视频最新在线| 日韩午夜电影| 欧美日韩视频| 九九色在线视频| 精品中文在线| 成人在线观看免费视频| 国产精品天堂蜜av在线播放| 日韩有吗在线观看| 婷婷久久免费视频| 日韩精品视频在线看| 亚洲精品免费观看| 亚洲久久在线| 日韩精品一二三区| 日韩av中文在线观看| 91精品国产一区二区在线观看| 国产精品午夜av| 日韩高清一区在线| 国产精品久久免费视频| 国产精品美女午夜爽爽| 免费一区二区三区在线视频| 你懂的亚洲视频| 日本精品在线中文字幕| 91精品国产成人观看| 尤物在线精品| 一区二区三区网站| 麻豆中文一区二区| av日韩中文| 91久久视频| 免费精品视频| 91亚洲精品在看在线观看高清| 亚洲精品在线国产| 欧美天堂在线| 九九99久久精品在免费线bt| 久久久久久久久久久妇女| 亚洲精品97| 欧美亚洲二区| 精品福利久久久| 99视频+国产日韩欧美| 免费高清在线一区| 麻豆视频久久| 国产精品一区二区免费福利视频| 福利一区在线| 久久香蕉国产| 中文字幕乱码亚洲无线精品一区| 久久成人福利| 日韩啪啪电影网| 首页国产欧美日韩丝袜| 日韩激情中文字幕| 日韩中文字幕高清在线观看| 亚洲精品小说| 久久不卡国产精品一区二区| 成人啊v在线| 欧美在线观看天堂一区二区三区| 久久精品国产999大香线蕉| 欧美女激情福利| 亚洲神马久久| 国产日韩欧美一区二区三区在线观看| 美腿丝袜在线亚洲一区| 中文字幕系列一区| 日韩有码av| 日韩av有码| 久久亚洲精品中文字幕蜜潮电影| 蜜臀av在线播放一区二区三区| 精品国产乱码久久久| 一区二区三区四区在线看| 欧美一区久久| 91精品推荐| 国产精品大片| 精品国模一区二区三区| 日韩欧美久久| 91精品国产福利在线观看麻豆| 久久亚洲不卡| 精品资源在线|