Java之反射
反射就是把Java類中的各種成分對映成一個個的java物件。
1.Java反射常用類
Class類—可獲取類和類的成員資訊
Field類—可訪問類的屬性
Method類—可呼叫類的方法
Constructor類—可呼叫類的構造方法
2.如何使用反射
1.匯入java.lang.reflect.*
2.獲得需要操作的類的Java.lang.Class物件
3.呼叫Class的方法獲取Field、Method等物件
4.使用反射API進行操作 (設定屬性﹑呼叫方法)
3.Class類
1)Class類是Java 反射機制的起源和入口
每個類都有自己的Class 物件且每一個類只有一個class 物件
用於獲取與類相關的各種資訊
提供了獲取類資訊的相關方法
Class類繼承自Object類
2)Class類存放類的結構資訊
3)【類物件】獲取類的Class 物件
方法1:物件.getClass()
Person person = new Person();
Class class2 = person.getClass();
方法2:類.class
Class class1 = Person.class;
方法3:Class.forName()
Class class3 = Class.forName("com.qf.demo.Person");
使用forname方法,引數為相對於本工程的Person類檔案路徑
4)【屬性】獲取Field 物件
【只能獲取public的屬性】Field[] fields = class1.getFields();
【獲取所有屬性】Field[] fields2 = class1.getDeclaredFields();
public屬性
【得到指定的屬性物件】Field field = class1.getField("age");
【 給屬性賦值】field.set(object, 5);
【得到屬性值,返回的是物件】Object object2 = field.get(object);
靜態屬性
【獲取屬性物件】Field field2 = class1.getDeclaredField("weight");
【屬性賦值】field2.set(null, 10);
【獲取屬性值】Object object3 = field2.get(null);
私有屬性
Field field3 = class1.getDeclaredField("name");
【設定許可權】field3.setAccessible(true);
field3.set(object, "小花");
Object object4 = field3.get(object);
5)【方法】獲取Method 物件
--Method[] methods = class1.getMethods();// 得到【本類和父類】的【非私有】的方法
--Method[] methods2 = class1.getDeclaredMethods();// 得到【本類】中宣告的所有的方法【包括私有】
--【得到無參無返回值方法】Method method = class1.getMethod("eat", null);
【方法呼叫】method.invoke(object, null);// 引數1:物件;引數2:方法引數
--【得到有參無返回值方法】Method method2 = class1.getMethod("drink", String.class);
【方法呼叫】method2.invoke(object, "水");
--【得到無參有返回值方法】Method method3 = class1.getMethod("sleep", null);
【呼叫】Object object2 = method3.invoke(object, null);//返回值都是用物件接收
--【靜態方法】Method method4 = class1.getMethod("hehe", null);
【呼叫,不需要傳物件】method4.invoke(null, null);
--【私有方法】Method method5 = class1.getDeclaredMethod("play", null);
【必須設定訪問許可權】method5.setAccessible(true);// 私有方法預設沒有許可權呼叫,必須單獨設定呼叫許可權
【呼叫】method5.invoke(object, null);
6)【構造方法】獲取Constructor物件
【獲取所有構造方法】Constructor[] constructors = class1.getConstructors();
【得到無參的構造方法】Constructor constructor = class1.getConstructor(null);
【建立物件】Person person = (Person) constructor.newInstance(null);
【得到有參的構造方法】Constructor constructor2 = class1.getConstructor(String.class,int.class,int.class);
【建立物件】Person person2 = (Person) constructor2.newInstance("張三",5,9);
4.反射優缺點
優點
1 提高了Java程式的靈活性和擴充套件性,降低了耦合性,提高自適應能力
2 允許程式建立和控制任何類的物件,無需提前硬編碼目標類
缺點
效能問題
程式碼維護問題
可以使用私有的屬性和方法,破壞了程式碼塊的安全性
相關文章
- java反射之Class類Java反射
- JAVA特性 之 反射(Reflection)Java反射
- Java學習之反射篇Java反射
- Java之註解與反射Java反射
- java 反射之操作靜態MethodJava反射
- Java高階語法之反射Java反射
- Java基礎之反射機制(續)Java反射
- JAVA基礎學習篇之反射Java反射
- 三. 重識Java之夯實反射Java反射
- 【Java 反射學習】Java 反射基礎Java反射
- [Java 反射學習] Java 反射基礎Java反射
- Java 反射Java反射
- Java——反射Java反射
- Java反射Java反射
- Java SE之反射技術[Class,Field](一)Java反射
- Java反射—初探反射基礎Java反射
- java框架基礎技術之--------反射機制Java框架反射
- java反射之動態代理學習筆記Java反射筆記
- Java 反射 APIJava反射API
- Java 反射原理Java反射
- Java的反射Java反射
- 20201209——java反射Java反射
- 淺析Java反射--JavaJava反射
- JAVA之反射學習3-反射獲取成員變數並賦值Java反射變數賦值
- 好程式設計師Java培訓分享Java之反射技術程式設計師Java反射
- Java筆記-Java反射(二)Java筆記反射
- Java基礎系列—Java反射Java反射
- Java 反射基礎Java反射
- Java反射-註解Java反射
- Java學習:反射Java反射
- Java反射-屬性Java反射
- Java反射-模組Java反射
- Java 反射詳解Java反射
- 秒懂Java反射Java反射
- java反射技術Java反射
- java反射全解Java反射
- Java 反射簡介Java反射
- java反射詳解Java反射
- Java筆記-反射Java筆記反射