反射如何拿到私有属性_JAVA中反射机制的价值
一、反射機(jī)制概述
Java 反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠獲得這個(gè)類的所有屬性和方法,對(duì)于任意一個(gè)對(duì)象都能夠調(diào)用它的任意一個(gè)屬性和方法。這種在運(yùn)行時(shí)動(dòng)態(tài)的獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為 Java 的反射機(jī)制。
lass 類與 java.lang.reflect 類庫(kù)一起對(duì)反射的概念進(jìn)行了支持,該類庫(kù)包含了 Field,Method,Constructor 類 (每個(gè)類都實(shí)現(xiàn)了 Member 接口)。這些類型的對(duì)象時(shí)由 JVM 在運(yùn)行時(shí)創(chuàng)建的,用以表示未知類里對(duì)應(yīng)的成員。
樣你就可以使用 Constructor 創(chuàng)建新的對(duì)象,用 get() 和 set() 方法讀取和修改與 Field 對(duì)象關(guān)聯(lián)的字段,用 invoke() 方法調(diào)用與 Method 對(duì)象關(guān)聯(lián)的方法。另外,還可以調(diào)用 getFields() getMethods() 和 getConstructors() 等很便利的方法,以返回表示字段,方法,以及構(gòu)造器的對(duì)象的數(shù)組。這樣匿名對(duì)象的信息就能在運(yùn)行時(shí)被完全確定下來(lái),而在編譯時(shí)不需要知道任何事情。
二、取字節(jié)碼的方式
在 Java 中可以通過(guò)三種方法獲取類的字節(jié)碼 (Class) 對(duì)象
通過(guò)Object 類中的 getClass() 方法,想要用這種方法必須要明確具體的類并且創(chuàng)建該類的對(duì)象。
所有數(shù)據(jù)類型都具備一個(gè)靜態(tài)的屬性.class 來(lái)獲取對(duì)應(yīng)的 Class 對(duì)象。但是還是要明確到類,然后才能調(diào)用類中的靜態(tài)成員。
只要通過(guò)給定類的字符串名稱就可以獲取該類的字節(jié)碼對(duì)象,這樣做擴(kuò)展性更強(qiáng)。通過(guò) Class.forName() 方法完成,必須要指定類的全限定名,由于前兩種方法都是在知道該類的情況下獲取該類的字節(jié)碼對(duì)象,因此不會(huì)有異常,但是 Class.forName() 方法如果寫(xiě)錯(cuò)類的路徑會(huì)報(bào) 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 { //方法三,如果這里不指定類所在的包名會(huì)報(bào) ClassNotFoundException 異常
class3 = Class.forName("com.jas.reflect.Fruit");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
ystem.out.println(class1 + " " +class2 + " " + class3);
}
}
lass Frui{}
三、通過(guò)反射機(jī)制獲取類信息
通過(guò)反射機(jī)制創(chuàng)建對(duì)象,在創(chuàng)建對(duì)象之前要獲得對(duì)象的構(gòu)造函數(shù)對(duì)象,通過(guò)構(gòu)造函數(shù)對(duì)象創(chuàng)建對(duì)應(yīng)類的實(shí)例。
下面這段代碼分別在運(yùn)期間創(chuàng)建了一個(gè)無(wú)參與有參的對(duì)象實(shí)例。由于 getConstructor() 方法與 newInstance() 方法拋出了很多異常 (你可以通過(guò)源代碼查看它們),這里就簡(jiǎn)寫(xiě)了直接拋出一個(gè) 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("無(wú)參構(gòu)造器 Run...........");
}
public Fruit(String type){
System.out.println("有參構(gòu)造器 Run..........." + type);
}
}
輸出:
無(wú)參構(gòu)造器 Run……..
有參構(gòu)造器 Run………..Apple
通過(guò)反射機(jī)制獲取 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"); 訪問(wèn)私有字段時(shí)會(huì)報(bào) NoSuchFieldException 異常
field = clazz.getDeclaredField("type"); //獲取私有 type 屬性
field.setAccessible(true); //對(duì)私有字段的訪問(wèn)取消檢查
Fruit fruit = (Fruit) clazz.newInstance(); //創(chuàng)建無(wú)參對(duì)象實(shí)例
field.set(fruit,"Apple"); //為無(wú)參對(duì)象實(shí)例屬性賦值
Object type = field.get(fruit); //通過(guò) fruit 對(duì)象獲取屬性值
System.out.printlntype);
}
}
class Fruit{
public in num;
private String type;
public Fruit(){
System.out.println("無(wú)參構(gòu)造器 Run...........");
}
public Fruit(String type){
System.out.println("有參構(gòu)造器 Run..........." + type);
}
}
輸出:
無(wú)參構(gòu)造器 Run………..
Apple
過(guò)反射機(jī)制獲取 Class 中的方法并運(yùn)行。
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"); //創(chuàng)建有參對(duì)象實(shí)例
method = clazz.getMethod("sow
總結(jié)
以上是生活随笔為你收集整理的反射如何拿到私有属性_JAVA中反射机制的价值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 辽宁号航母为何要烧重油
- 下一篇: u盘不显示怎么办win10 win10下