Java通过反射访问成员变量
生活随笔
收集整理的這篇文章主要介紹了
Java通过反射访问成员变量
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
通過下列任意一個方法訪問成員變量時將返回 Field 類型的對象或數組。
getFields()getField(String name)getDeclaredFields()getDeclaredField(String name)上述方法返回的 Field 對象代表一個成員變量。例如,要訪問一個名稱為 price 的成員變量,示例代碼如下:
object.getDeciaredField("price");Field類的常用方法
| getName() | 獲得該成員變量的名稱 |
| getType() | 獲取表示該成員變量的 Class 對象 |
| get(Object obj) | 獲得指定對象 obj 中成員變量的值,返回值為 Object 類型 |
| set(Object obj, Object value) | 將指定對象 obj 中成員變量的值設置為 value |
| getlnt(0bject obj) | 獲得指定對象 obj 中成員類型為 int 的成員變量的值 |
| setlnt(0bject obj, int i) | 將指定對象 obj 中成員變量的值設置為 i |
| setFloat(Object obj, float f) | 將指定對象 obj 中成員變量的值設置為 f |
| getBoolean(Object obj) | 獲得指定對象 obj 中成員類型為 boolean 的成員變量的值 |
| setBoolean(Object obj, boolean b) | 將指定對象 obj 中成員變量的值設置為 b |
| getFloat(Object obj) | 獲得指定對象 obj 中成員類型為 float 的成員變量的值 |
| setAccessible(boolean flag) | 此方法可以設置是否忽略權限直接訪問 private 等私有權限的成員變量 |
| getModifiers() | 獲得可以解析出該方法所采用修飾符的整數 |
示例如何調用 Field 類的方法獲取動態類中各個成員的信息。
1 . 首先創建一個 Book 類,在該類中依次聲明一個 String、int、float 和 boolean 類型的成員,并設置不同的訪問作用域。Book 類最終的代碼如下:
public class Book {String name;public int id;private float price;protected boolean isLoan; }2)編寫測試類 Test,在該類的 main() 方法中通過反射訪問 Book 類中的所有成員,并將該成員的名稱和類型信息輸出到控制臺。
Test 類的代碼如下:
import java.lang.reflect.Constructor; import java.lang.reflect.Field; public class Test {public static void main(String[] args) {Book book = new Book();// 獲取動態類BookClass class1 = book.getClass();// 獲取Book類的所有成員Field[] declaredFields = class1.getDeclaredFields();// 遍歷所有的成員for(int i = 0;i < declaredFields.length;i++) { // 獲取類中的成員變量Field field = declaredFields[i];System.out.println("成員名稱為:" + field.getName());Class fieldType = field.getType();System.out.println("成員類型為:" + fieldType);boolean isTurn = true;while(isTurn) {try { // 如果該成員變量的訪問權限為private,則拋出異常isTurn = false;System.out.println("修改前成員的值為:" + field.get(book));// 判斷成員類型是否為intif(fieldType.equals(int.class)) {System.out.println("利用setInt()方法修改成員的值");field.setInt(book, 100);} else if(fieldType.equals(float.class)) { // 判斷成員變量類型是否為floatSystem.out.println("利用setFloat()方法修改成員的值");field.setFloat(book, 29.815f);} else if(fieldType.equals(boolean.class)) { // 判斷成員變量是否為booleanSystem.out.println("利用setBoolean()方法修改成員的值");field.setBoolean(book, true);} else {System.out.println("利用set()方法修改成員的值");field.set(book, "Java編程");}System.out.println("修改后成員的值為:" + field.get(book));} catch (Exception e) {System.out.println("在設置成員變量值時拋出異常,下面執行setAccessible()方法");field.setAccessible(true);isTurn = true;}}System.out.println("=============================\n");}} }3 . 運行測試類 Test,程序將會依次動態訪問 Book 類中的所有成員。訪問 name 成員的運行效果如下所示:
成員名稱為:name 成員類型為:class java.lang.String 修改前成員的值為:null 利用set()方法修改成員的值 修改后成員的值為:Java編程 =============================訪問 id 成員的運行效果如下所示:
成員名稱為:id 成員類型為:int 修改前成員的值為:0 利用setInt()方法修改成員的值 修改后成員的值為:100 =============================訪問 price 成員的運行效果如下所示:
成員名稱為:price 成員類型為:float 在設置成員變量值時拋出異常,下面執行setAccessible()方法 修改前成員的值為:0.0 利用setFloat()方法修改成員的值 修改后成員的值為:29.815 =============================訪問 isLoan 成員的運行效果如下所示:
成員名稱為:isLoan 成員類型為:boolean 修改前成員的值為:false 利用setBoolean()方法修改成員的值 修改后成員的值為:true =============================總結
以上是生活随笔為你收集整理的Java通过反射访问成员变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C 画椭圆
- 下一篇: Java的异常跟踪栈