java中的反射,java反射
一、什麼是反射
簡單來說,java反射機制其實就是I/O流的一種封裝版,用來快速讀取硬盤上的class文件。class文件相當於一個身份證,JVM在操作某一個對象時,需要根據身份證獲得對象擁有的屬性和擁有的功能及方法。這種動態獲取的信息以及動態調用對象方法的功能稱為java語言的反射機制。
二、官方提供的反射機制API:
class文件: java.lang.reflect.Class類:描述內存中class文件
屬性(數據存儲單位): java.lang.reflect.Field類:描述內存中class文件中屬性
方法: 構造方法: java.lang.reflect.Construtcor類:描述內存中class文件構造方法
功能性方法: java.lang.reflect.Method類:描述內存中class文件功能方法
三、加載硬盤上的class文件三種方式:
1、Class.forName();
2、類名.class;
3、對象.getClass();
四、獲取內存中類文件包含的屬性信息:
Class管理內存中class文件。提供對應方法讀取class文件中的屬性信息
1、讀取僅僅在當前class文件定義的屬性的方法:
getDeclaredFields();
2、讀取在當前class文件定義的以及從父類中繼承而來的公有屬性的方法:
getFields();
五、java中反射機制的優缺點:
優點:1、能夠在運行時動態獲取類的信息,大大地提供裡程序的靈活性和擴展性;
2、和動態編譯功能相結合,可以實現超強的功能。
缺點:1、比較耗費資源,大幅降低程序運行時的性能;
2、破壞了程序的封裝性,可以通過反射來獲取某個類的私有屬性,相對來說降低了程序的安全性。
總結:任何事物都有其兩面性,沒有好與壞,能夠在不同的場景下靈活運用才是關鍵。
六、讓代碼告訴你這一切:
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011812324772.gif)
![]()
1 package com.bjpowernode.util;
2
3 import java.lang.reflect.Field;
4
5 public class ReflectUtil {
6 /**
7 * 如果當前工程java project:classPath
8 * @param classPath
9 * @throws ClassNotFoundException
10 */
11 public static void load(String classPath) throws ClassNotFoundException{
12 Class classObj = Class.forName(classPath);
13 }
14 /**
15 * 一個類在運行期間,只會被加載到內存一次
16 * 此時如何定位內存中的類文件 通知JVM
17 * 到內存中找到studentVo.class文件
18 * @param classObj
19 */
20 public static void load(Class classObj){
21
22 }
23 /**
24 * 通知JVM定位當前對象隸屬的class文件所在內存中的位置
25 * @param obj
26 */
27 public static void load(Object obj){
28 obj.getClass();
29 }
30
31 /**
32 * 功能:獲得當前對象擁有的共有屬性
33 * @param obj
34 */
35 public static void getInfo(Object obj){
36 Class classObj = obj.getClass();
37 Field fieldArray[] = classObj.getFields();
38 for(int i=0;i<fieldArray.length;i++){
39 Field fieldObj = fieldArray[i];
40 String fieldName= fieldObj.getName();
41 System.out.println(fieldName);
42 }
43 }
44
45 public static void getInfo2(Object obj){
46 Class classObj = obj.getClass();
47 Field fieldArray[] = classObj.getDeclaredFields();
48 for (int i = 0; i < fieldArray.length; i++) {
49 Field fieldObj = fieldArray[i];
50 String fieldName = fieldObj.getName();
51 String typeName = fieldObj.getType().getName();
52 System.out.println("屬性名"+fieldName+"數據類型名"+typeName);
53 }
54 }
55
56
57 }
View Code
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011812324772.gif)
![]()
1 package com.bjpowernode.entity;
2
3 public class Person {
4 public String name;
5
6 }
View Code
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011812324772.gif)
![]()
1 package com.bjpowernode.entity;
2
3 public class StudentVO extends Person {
4 public int sid;
5 protected int age;
6 private int score;
7
8 }
View Code
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011812324772.gif)
![]()
1 package com.bjpowernode.def;
2
3 import com.bjpowernode.entity.StudentVO;
4 import com.bjpowernode.util.ReflectUtil;
5
6 public class 獲得陌生對象中共有屬性名稱 {
7
8 public static void main(String[] args) {
9
10 Object stu = new StudentVO();
11 ReflectUtil.getInfo(stu);
12
13 }
14
15 }
View Code
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011812324772.gif)
![]()
1 package com.bjpowernode.def;
2
3 import com.bjpowernode.entity.StudentVO;
4 import com.bjpowernode.util.ReflectUtil;
5
6 public class 獲得陌生對象定義的所有屬性 {
7
8 public static void main(String[] args) {
9 Object obj = new StudentVO();
10 ReflectUtil.getInfo2(obj);
11
12 }
13
14 }
View Code