反射如何拿到私有属性_JAVA中反射机制的价值
一、反射機制概述
Java 反射機制是在運行狀態中,對于任意一個類,都能夠獲得這個類的所有屬性和方法,對于任意一個對象都能夠調用它的任意一個屬性和方法。這種在運行時動態的獲取信息以及動態調用對象的方法的功能稱為 Java 的反射機制。
lass 類與 java.lang.reflect 類庫一起對反射的概念進行了支持,該類庫包含了 Field,Method,Constructor 類 (每個類都實現了 Member 接口)。這些類型的對象時由 JVM 在運行時創建的,用以表示未知類里對應的成員。
樣你就可以使用 Constructor 創建新的對象,用 get() 和 set() 方法讀取和修改與 Field 對象關聯的字段,用 invoke() 方法調用與 Method 對象關聯的方法。另外,還可以調用 getFields() getMethods() 和 getConstructors() 等很便利的方法,以返回表示字段,方法,以及構造器的對象的數組。這樣匿名對象的信息就能在運行時被完全確定下來,而在編譯時不需要知道任何事情。
二、取字節碼的方式
在 Java 中可以通過三種方法獲取類的字節碼 (Class) 對象
通過Object 類中的 getClass() 方法,想要用這種方法必須要明確具體的類并且創建該類的對象。
所有數據類型都具備一個靜態的屬性.class 來獲取對應的 Class 對象。但是還是要明確到類,然后才能調用類中的靜態成員。
只要通過給定類的字符串名稱就可以獲取該類的字節碼對象,這樣做擴展性更強。通過 Class.forName() 方法完成,必須要指定類的全限定名,由于前兩種方法都是在知道該類的情況下獲取該類的字節碼對象,因此不會有異常,但是 Class.forName() 方法如果寫錯類的路徑會報 ClassNotFoundException 的異常。
package com.jas.reflect;
publc class ReflectTest {
public static void main(String[] args) {
Fruit fruit = new Fruit();
Class> class1 = fruit.getClass(); //方法一
Class> class2 = Fruit.class; //方法二
Class class3 = null;
try { //方法三,如果這里不指定類所在的包名會報 ClassNotFoundException 異常
class3 = Class.forName("com.jas.reflect.Fruit");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
ystem.out.println(class1 + " " +class2 + " " + class3);
}
}
lass Frui{}
三、通過反射機制獲取類信息
通過反射機制創建對象,在創建對象之前要獲得對象的構造函數對象,通過構造函數對象創建對應類的實例。
下面這段代碼分別在運期間創建了一個無參與有參的對象實例。由于 getConstructor() 方法與 newInstance() 方法拋出了很多異常 (你可以通過源代碼查看它們),這里就簡寫了直接拋出一個 Exception,下同。
package com.as.reflect;
import java.ang.reflect.Constructor;
public class eflectTest {
public static void main(String[] args) throws Exception {
Class lazz = null;
clazz = Class.forName("com.jas.reflect.Fruit");
Constructor constructor1 = clazz.getConstructor();
Constructor constructor2 = clazz.getConstructor(String.class);
Fruit frit1 = constructor1.newInstance();
Fruit fruit2 = constructor2.newInstance("Apple");
}
}
class Frut{
ublic Fruit(){
System.out.println("無參構造器 Run...........");
}
public Fruit(String type){
System.out.println("有參構造器 Run..........." + type);
}
}
輸出:
無參構造器 Run……..
有參構造器 Run………..Apple
通過反射機制獲取 Class 中的屬性。package com.jas.reflct;
import java.lang.reflet.Field;
public class ReflectTet {
public static void main(String[] args) throws Exception {
Class> clazz =null;
Field field = null;
clazz = Class.foName("com.jas.reflect.Fruit");
//field = clazz.getField("num"); getField() 方法不能獲取私有的屬性
// field = clazz.getField("type"); 訪問私有字段時會報 NoSuchFieldException 異常
field = clazz.getDeclaredField("type"); //獲取私有 type 屬性
field.setAccessible(true); //對私有字段的訪問取消檢查
Fruit fruit = (Fruit) clazz.newInstance(); //創建無參對象實例
field.set(fruit,"Apple"); //為無參對象實例屬性賦值
Object type = field.get(fruit); //通過 fruit 對象獲取屬性值
System.out.printlntype);
}
}
class Fruit{
public in num;
private String type;
public Fruit(){
System.out.println("無參構造器 Run...........");
}
public Fruit(String type){
System.out.println("有參構造器 Run..........." + type);
}
}
輸出:
無參構造器 Run………..
Apple
過反射機制獲取 Class 中的方法并運行。
packae com.jas.reflect;
importjava.lang.reflect.Constrctor;
import java.lang.reflect.Method;
public class ReflectTest {
pulic static void main(String[] args) throws Exception {
Class clazz = null;
Method method = null;
clazz = Class.forName("com.as.reflect.Fruit");
Constructor fruitConstructor = clazz.getConstructor(String.class);
Fruit fruit = fruitConstructor.newInstance("Apple"); //創建有參對象實例
method = clazz.getMethod("sow
總結
以上是生活随笔為你收集整理的反射如何拿到私有属性_JAVA中反射机制的价值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 辽宁号航母为何要烧重油
- 下一篇: docker 发布tomcat项目_Do