日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

反射如何拿到私有属性_JAVA中反射机制的价值

發(fā)布時(shí)間:2024/10/12 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反射如何拿到私有属性_JAVA中反射机制的价值 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、反射機(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 類庫一起對(duì)反射的概念進(jìn)行了支持,該類庫包含了 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í)被完全確定下來,而在編譯時(shí)不需要知道任何事情。

二、取字節(jié)碼的方式

在 Java 中可以通過三種方法獲取類的字節(jié)碼 (Class) 對(duì)象

通過Object 類中的 getClass() 方法,想要用這種方法必須要明確具體的類并且創(chuàng)建該類的對(duì)象。

所有數(shù)據(jù)類型都具備一個(gè)靜態(tài)的屬性.class 來獲取對(duì)應(yīng)的 Class 對(duì)象。但是還是要明確到類,然后才能調(diào)用類中的靜態(tài)成員。

只要通過給定類的字符串名稱就可以獲取該類的字節(jié)碼對(duì)象,這樣做擴(kuò)展性更強(qiáng)。通過 Class.forName() 方法完成,必須要指定類的全限定名,由于前兩種方法都是在知道該類的情況下獲取該類的字節(jié)碼對(duì)象,因此不會(huì)有異常,但是 Class.forName() 方法如果寫錯(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{}

三、通過反射機(jī)制獲取類信息

通過反射機(jī)制創(chuàng)建對(duì)象,在創(chuàng)建對(duì)象之前要獲得對(duì)象的構(gòu)造函數(shù)對(duì)象,通過構(gòu)造函數(shù)對(duì)象創(chuàng)建對(duì)應(yīng)類的實(shí)例。

下面這段代碼分別在運(yùn)期間創(chuàng)建了一個(gè)無參與有參的對(duì)象實(shí)例。由于 getConstructor() 方法與 newInstance() 方法拋出了很多異常 (你可以通過源代碼查看它們),這里就簡(jiǎn)寫了直接拋出一個(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("無參構(gòu)造器 Run...........");

}

public Fruit(String type){

System.out.println("有參構(gòu)造器 Run..........." + type);

}

}

輸出:

無參構(gòu)造器 Run……..

有參構(gòu)造器 Run………..Apple

通過反射機(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"); 訪問私有字段時(shí)會(huì)報(bào) NoSuchFieldException 異常

field = clazz.getDeclaredField("type"); //獲取私有 type 屬性

field.setAccessible(true); //對(duì)私有字段的訪問取消檢查

Fruit fruit = (Fruit) clazz.newInstance(); //創(chuàng)建無參對(duì)象實(shí)例

field.set(fruit,"Apple"); //為無參對(duì)象實(shí)例屬性賦值

Object type = field.get(fruit); //通過 fruit 對(duì)象獲取屬性值

System.out.printlntype);

}

}

class Fruit{

public in num;

private String type;

public Fruit(){

System.out.println("無參構(gòu)造器 Run...........");

}

public Fruit(String type){

System.out.println("有參構(gòu)造器 Run..........." + type);

}

}

輸出:

無參構(gòu)造器 Run………..

Apple

過反射機(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ǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。