Java Field 类


Field

  • 使用 Java 的反射机制获得类的成员变量的对象;
  • 可以用 Field 类的 get 方法获取对象的值,也可以用 set 方法改变对象的值;
  • java.lang.reflect.Field,详见:Class Field

1. 定义格式

  • public final class Field extends AccessibleObject implements Member
  • Field 类的对象表示类或接口的一个域,可以是静态域,也可以是实例域;

2. 主要方法

类型 方法 说明
Object get(Object o) 获得 o 对象中相应域的值
Class getDeclaringClass() 得到一个 Class 类的对象
String getName() 获得 Field 类对象所表示的域的名字
T getAnnotation(Class annotationClass) 获得 annotationClass 类中当前 Field 类对象所表示的域的注解实例
boolean isAnnotationPresent(Class annotationClass) 判断 annotationClass 类中当前 Field 类对象所表示的域是否有注解
void set(Object o, Object value) 设置与 Field 对象对应的 o 对象中的域的值为 value

3. Java 实例

  • 通过类的反射获得 Reflect 的 Class 对象 c;
  • 调用 newInstance() 方法创建 Reflect 对象 r;
  • 通过 Class 类的 getDeclaredField 方法获得对象 c 所表示的实体的指定 name 字段;
  • 通过对 Field 类使用方法 setAccessible(true) 方法取消对私有成员变量 name 的访问检查;
  • 通过对 Field 的 set 方法为对象 r 的 name 字段赋值,并通过它的 get 方法获得 name 字段的值;
  • 获取 id 字段的步骤同理;
import java.lang.reflect.Field;

class Reflect {
    private int id = 1;
    private String name = "成员变量";
}

public class test {
    public static void main(String[] args) {
        try {
            //获得Class对象
            Class c = Class.forName("Reflect");
            //使用无参构造方法创建对象r
            Reflect r = (Reflect) c.newInstance();
            //获取指定类的私有属性name
            Field f = c.getDeclaredField("name");
            //取消访问检查
            f.setAccessible(true);
            f.set(r, "成员变量");
            System.out.println("name = " + f.get(r));
            //获得私有属性id
            Field fId = c.getDeclaredField("id");
            //取消访问检查
            fId.setAccessible(true);
            fId.setInt(r, 12);
            System.out.println("id = " + fId.getInt(r));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
/*
输出
name = 成员变量
id = 12
 */
发布了185 篇原创文章 · 获赞 181 · 访问量 5382

猜你喜欢

转载自blog.csdn.net/Regino/article/details/104649023