本文共 2035 字,大约阅读时间需要 6 分钟。
使用Java反射,您可以检查类的字段(成员变量)并在运行时获取/设置它们。 这是通过Java类java.lang.reflect.Field完成的。 本文将更详细地介绍Java Field对象。 请记住也要检查Sun的JavaDoc。
Field类是从Class对象中获取的。 这里是一个例子:
Class aClass = ...//获取一个class对象Field[] fields = aClass.getFields();
Field []数组将为每个在类中声明的公共字段设置一个Field实例。
如果您知道要访问的字段的名称,则可以像这样访问它:
Class aClass = MyObject.classField field = aClass.getField("someField");
上面的例子将返回Field实例对应的字段someField,如下面的MyObject所声明的:
public class MyObject{ public String someField = null;}
如果没有字段以getField()方法的参数形式存在,则抛出NoSuchFieldException。
获得Field实例后,可以使用Field.getName()方法获取其字段名称,如下所示:
Field field = ... //obtain field objectString fieldName = field.getName();
您可以使用Field.getType()方法确定字段的字段类型(String,int等):
Field field = aClass.getField("someField");Object fieldType = field.getType();
获得Field引用后,可以使用Field.get()和Field.set()方法来获取和设置其值,如下所示:
Class aClass = MyObject.classField 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.StringFantJshuai
项目代码:
转载地址:http://ygcta.baihongyu.com/