Field类提供了对类成员变量的操作方法,应用这些方法可以获取成员变量的名称、类型、值,也可以设置成员变量的值。Field类在java.lang.reflect包内。
Field类定义的主要方法说明如下。
● String getName()
该方法用于获取成员变量的名称。
● Class<?> getType()
该方法用于获取成员变量的类型。
● Object get(Object obj)
该方法用于获取指定对象成员变量的值,返回类型是Object类型。
● void set(Object obj, Object value)
该方法用于设置指定对象成员变量的值,参数value为要设定的值。
● byte getByte(Object obj)
该方法用于获取指定对象成员变量类型为byte的值,返回类型为byte。
● void setByte(Object obj, byte b)
该方法用于设置指定对象成员变量类型为byte的值,参数b为要设定的值。
● int getInt(Object obj)
该方法用于获取指定对象成员变量类型为int的值,返回类型为int。
● void setInt(Object obj, int i)
该方法用于设置指定对象成员变量类型为int的值,参数i为要设定的值。
● float getFloat(Object obj)
该方法用于获取指定对象成员变量类型为float的值,返回类型为float。
● void setFloat(Object obj, float f)
该方法用于设置指定对象成员变量类型为float的值,参数f为要设定的值。
● double getDouble(Object obj)
该方法用于获取指定对象成员变量类型为double的值,返回类型为double。
● void setDouble(Object obj, double d)
该方法用于设置指定对象成员变量类型为double的值,参数d为要设定的值。
● char getChar(Object obj)
该方法用于获取指定对象成员变量类型为char的值,返回类型为char。
● void setChar(Object obj, char c)
该方法用于设置指定对象成员变量类型为char的值,参数c为要设定的值。
● boolean getBoolean (Object obj)
该方法用于获取指定对象成员变量类型为boolean的值,返回类型为boolean。
● void setBoolean (Object obj, boolean z)
该方法用于设置指定对象成员变量类型为boolean的值,参数z为要设定的值。
● int getModifiers()
该方法返回一个整数,该整数可用于Modifier获取修饰符方法的传入参数。
案例1:建立FieldTest2测试类,应用Class类的getFields()方法获取Person类的公共成员变量,输出每个成员变量的类型和修饰符,并设置成员变量的值。
在field包下新建FieldTest2类。代码如下:
package field;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import constructor.Person;
/**
* @ClassName: FieldTest2
* @Description: 反射(成员变量的相关操作)案例1
* @author 编程训练营
* @date
*
*/
public class FieldTest2 {
/**
* @Title: main
* @Description:Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// 获取Person类的Class对象
Class<?> personClass = (Class)Person.class;
try {
// 获取默认构造方法
Constructor defaultConstructor = personClass.getConstructor();
// 实例化Person对象
Person person = (Person)defaultConstructor.newInstance();
//通过class.getFields()获取所有具有public权限的成员变量
Field[] fields = personClass.getFields();
for (Field field : fields) {
// 输出成员变量的名称
System.out.printf("成员变量:%s\n",field.getName());
// 获取和设置成员变量的值
if( field.getName().equals("job") )
{
System.out.printf("成员变量%s的值为:%s\n",field.getName(),field.get(person));
field.set(person,"程序员");
}
if( field.getName().equals("income") )
{
System.out.printf("成员变量%s的值为:%.2f\n",field.getName(),field.getDouble(person));
field.setDouble(person, 15000);
}
}
// 输出person对象成员变量job和income的值
System.out.printf("成员变量%s的值为:%s\n","job",person.getJob());
System.out.printf("成员变量%s的值为:%.2f\n","income",person.getIncome());
} catch (NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}FieldTest2程序首先获取Person类默认的构造方法,并应用Constructor类的newInstance()方法实例化Person对象。然后调用Class类的getFields()方法获取Person类的公共成员变量,依据获取的变量名称获取变量成员的默认值和设置成员变量的值。Field类的get和set成员变量的方法都需要传入前面实例化的person对象。
程序执行结果如下图所示:
