Java反射 - 字段

使用Java反射,您可以检查类的字段(成员变量)并在运行时获取/设置它们。 这是通过Java类java.lang.reflect.Field完成的。 本文将更详细地介绍Java Field对象。 请记住也要检查Sun的JavaDoc。

获取字段对象

Field类是从Class对象中获取的。 这里是一个例子:

Class aClass = ...//获取一个class对象
Field[] fields = aClass.getFields();

Field []数组将为每个在类中声明的公共字段设置一个Field实例。

如果您知道要访问的字段的名称,则可以像这样访问它:

Class  aClass = MyObject.class
Field field = aClass.getField("someField");

上面的例子将返回Field实例对应的字段someField,如下面的MyObject所声明的:

public class MyObject{
  public String someField = null;

}

如果没有字段以getField()方法的参数形式存在,则抛出NoSuchFieldException。

字段名称

获得Field实例后,可以使用Field.getName()方法获取其字段名称,如下所示:

Field field = ... //obtain field object
String fieldName = field.getName();

字段类型

您可以使用Field.getType()方法确定字段的字段类型(String,int等):

Field field = aClass.getField("someField");
Object fieldType = field.getType();

获取和设置字段值

获得Field引用后,可以使用Field.get()和Field.set()方法来获取和设置其值,如下所示:

Class  aClass = MyObject.class
Field field = aClass.getField("someField");

MyObject objectInstance = new MyObject();

Object value = field.get(objectInstance);

field.set(objetInstance, value);

传递给get和set方法的objectInstance参数应该是拥有该字段的类的一个实例。 在上面的例子中,使用了MyObject的实例,因为someField是MyObject类的实例成员。

它是一个静态字段(public static ...),它传递null作为get和set方法的参数,而不是上面传递的objectInstance参数。

实战

package com.reflection.detail;

import java.lang.reflect.Field;

/**
 * Created by Fant.J.
 * 2018/2/7 14:51
 */
public class Reflection_Fields {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

        //获取field对象
        Class aClass = People.class;
        Field[] fields = aClass.getFields();

        //如果你知道一些字段的名字,你可以这样获取到它
        Field field = aClass.getField("someField");
        System.out.println(field.getName()+"   "+field.getType());

        //那么,我们能获取到它的字段类型,那如何取出该字段的值呢
        People people = new People();
        Object obj = field.get(people);
        System.out.println(obj.toString());

        //如何给字段设置值呢
        field.set(people,"shuai");
        Object obj2 = field.get(people);
        System.out.println(obj2.toString());
    }
}

结果

someField   class java.lang.String
FantJ
shuai

项目代码:github链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值