java.lang.reflect.Field
一、Field類是什么
Field是一個類,位於java.lang.reflect包下。
在Java反射中 Field類描述的是 類的屬性信息,通俗來講 有一個類如下:
1 package com.testReflect; 2 public class FieldDemo { 3 public int num1 = 1; 4 protected int num2 = 2; 5 int num3 = 3; 6 private int num4 = 4; 7 8 public String s1 = "a"; 9 protected String s2 = "b"; 10 String s3 = "c"; 11 private String s4 = "d"; 12 }
在Java反射中FieldDemo類中的屬性: num1、num2、num3、num4 都是Field類的實例,這個Field類的實例描述了屬性的全部信息。(包括:屬性名稱、屬性類型、屬性修飾符、屬性注解 等等)
二、如何獲取Field類對象
一共有4種方法,全部都在Class類中:
- getFields(): 獲取類中public類型的屬性
- getField(String name): 獲取類特定的方法,name參數指定了屬性的名稱
- getDeclaredFields(): 獲取類中所有的屬性(public、protected、default、private),但不包括繼承的屬性。
- getDeclaredField(String name): 獲取類特定的方法,name參數指定了屬性的名稱
三、Field類中常用的方法
對於類中的屬性,我們常用的操作:獲取屬性的值、修改屬性的值。
1 package com.testReflect; 2 3 import java.lang.reflect.Field; 4 import java.lang.reflect.Modifier; 5 6 public class FieldTest { 7 public static void main(String[] args) throws Exception { 8 //使用反射第一步:獲取操作類FieldDemo所對應的Class對象 9 Class<?> cls = Class.forName("com.testReflect.FieldDemo"); 10 //使用FieldDemo類的class對象生成 實例 11 Object obj = cls.newInstance(); 12 13 //通過Class類中getField(String name): 獲取類特定的方法,name參數指定了屬性的名稱 14 Field field = cls.getField("num1"); 15 16 //拿到了Field類的實例后就可以調用其中的方法了 17 18 //方法:getModifiers() 以整數形式返回由此 Field 對象表示的字段的 Java 語言修飾符 19 System.out.println("修飾符: " + Modifier.toString(field.getModifiers())); 20 21 //方法:getType() 返回一個 Class 對象,它標識了此 Field 對象所表示字段的聲明類型 22 System.out.println("類型: "+field.getType()); 23 24 //方法:get(Object obj) 返回指定對象obj上此 Field 表示的字段的值 25 System.out.println("屬性值: "+field.get(obj)); 26 27 //方法: set(Object obj, Object value) 將指定對象變量上此 Field 對象表示的字段設置為指定的新值 28 field.set(obj, 55); 29 System.out.println("修改屬性值后 --> get(Object obj): "+field.get(obj)); 30 } 31 }