Java——反射(reflection)详解
生活随笔
收集整理的這篇文章主要介紹了
Java——反射(reflection)详解
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 反射(reflection)
- 引出反射
- Java Reflection
- java反射機制可以完成
- 反射相關(guān)的主要類:
- 反射優(yōu)點和缺點
- 反射調(diào)用優(yōu)化-關(guān)閉訪問檢查
- Class類
- 基本介紹
- Class類的常用方法:
- 獲取Class 對象:
- 拓展:哪些類型有Class對象
- 類加載
- 基本說明
- 類加載時機
- 加載階段
- 連接階段-解析
- Initialiaztion(初始化)
- 通過反射獲取類的結(jié)構(gòu)信息
- 第一組:java.lang.Class 類
- 第二組: java.lang.reflect.Field 類
- 通過反射創(chuàng)建對象
- 通過反射訪問類中的成員
- 訪問屬性
- 訪問方法
- 應用案例
反射(reflection)
引出反射
Java Reflection
java反射機制可以完成
反射相關(guān)的主要類:
反射優(yōu)點和缺點
反射調(diào)用優(yōu)化-關(guān)閉訪問檢查
Class類
基本介紹
Class類的常用方法:
String classAllPath = "reflection.Car";//獲取到Car 類對應的 Class 對象// <?>表示不確定的java 類型Class<?> aClass = Class.forName(classAllPath);//輸出clsSystem.out.println(aClass); //顯示aClass 對象,是哪個類的Class reflection.CarSystem.out.println(Class.class); //輸出aClass 運行類型 java.lang.Class//3. 得到包名System.out.println(aClass.getPackage().getName());//4.全類名System.out.println(aClass.getName());//5.通過aClass 創(chuàng)建一個對象實例Car car =(Car) aClass.getConstructor().newInstance();System.out.println(car);//6. 通過反射獲取屬性 brandField color = aClass.getField("color");System.out.println(color.get(car));//7. 通過反射給屬性賦值color.set(car,"黃色");System.out.println(color.get(car));//8. 遍歷所有屬性System.out.println("====================");Field[] fields = aClass.getFields();for( Field n : fields){System.out.println(n.getName());}獲取Class 對象:
public static void main(String[] args) throws Exception {//1.Class.forNameString classAllPath = "reflection.Car";Class<?> aClass1 = Class.forName(classAllPath);Object o = aClass1.getConstructor().newInstance();Field color = aClass1.getField("color");System.out.println(color.get(o));//2. 類名.classClass carClass2 = Car.class;System.out.println(carClass2);//3.對象.getClass(),應用場景,有對象實例Car car = new Car();Class aClass3 = car.getClass();System.out.println(aClass3);//4.通過類的加載器(4中類加載器)來獲取到類的Class 對象// (1)先得到類加載器 carClassLoader classLoader = car.getClass().getClassLoader();// (2) 通過類加載器得到Class 對象Class<?> aClass4 = classLoader.loadClass(classAllPath);System.out.println(aClass4);// 上四個均為同一個對象System.out.println(aClass1.hashCode());System.out.println(carClass2.hashCode());System.out.println(aClass3.hashCode());System.out.println(aClass4.hashCode());//5.基本數(shù)據(jù)類型(int,char,boolean,float,double,byte,long,short)按如下方式得到Class類對象//Class aClass = 基本數(shù)據(jù)類型.classClass<Integer> integerClass = int.class;System.out.println(integerClass);Class<Character> characterClass = char.class;//6.基本數(shù)據(jù)類型對應的包裝類,可以通過.type得到Class類對象//Class aClass = 包裝類.TYPE;Class<Integer> integerClass1 = Integer.class;System.out.println(integerClass1);Class<Boolean> booleanClass = Boolean.class; }拓展:哪些類型有Class對象
類加載
基本說明
反射機制是java實現(xiàn)動態(tài)語言的關(guān)鍵,也就是通過反射實現(xiàn)類動態(tài)加載.
類加載時機
加載階段
JVM 在該階段的主要目的是將字節(jié)碼從不同的數(shù)據(jù)源(可能是class 文件、也可能是jar包,甚至網(wǎng)絡) 轉(zhuǎn)化為二進制字節(jié)流加載到內(nèi)存中,并生成一個代表該類的java.lang.Class 對象
public int n1 = 10; public static int n2 = 20; public static final int n3 = 30;// n1 是實例屬性,不是靜態(tài)變量,因此在準備階段,是不會分配內(nèi)存 // n2 是靜態(tài)變量,分配內(nèi)存 n2 是默認初始化 0,而不是20 // n3 是static final 是常量,他和靜態(tài)變量不一樣,因為一旦賦值就不變 n3 = 30連接階段-解析
虛擬機將常量池內(nèi)的符號引用替換為直接引用的過程
Initialiaztion(初始化)
通過反射獲取類的結(jié)構(gòu)信息
第一組:java.lang.Class 類
第二組: java.lang.reflect.Field 類
getModfiers:以int 形式返回修飾符
[說明: 默認修飾符 是0, public 是1 ,private 是 2, protected 是4, static 是8 ,final 是 16]
getType:
以Class 形式返回類型
getName: 返回屬性名
通過反射創(chuàng)建對象
- newInstance : 調(diào)用類中的無參構(gòu)造器, 獲取對應類的對象
- getConstructor(Class…cls): 根據(jù)參數(shù)列表,獲取對應的public 構(gòu)造器對象
- getDecalaredConstructor(Class…cls ): 根據(jù)參數(shù)列表,獲取對應的構(gòu)造器對象
- setAccessible: 暴破
- newInstance(Object…obj): 調(diào)用構(gòu)造器
通過反射訪問類中的成員
訪問屬性
Field f = cls 對象.getDeclareField(屬性名);
訪問方法
應用案例
Class<?> aClass = Class.forName("java.io.File");Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();for (Constructor<?> declaredConstructor : declaredConstructors) {System.out.println("File類中的構(gòu)造器為=" + declaredConstructor);}Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class);String FilePath ="E:\\myNew.txt";Object file = declaredConstructor.newInstance(FilePath);Method createNewFile = aClass.getMethod("createNewFile");//得到方法的對象createNewFile.invoke(file);總結(jié)
以上是生活随笔為你收集整理的Java——反射(reflection)详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 股票十档行情数据接口怎么看?
- 下一篇: 配置Linux服务器防火墙端口规则