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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/10/12 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反射如何拿到私有属性_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中反射机制的价值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。