一、Field
- Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。
- 反射的字段可能是一个类(静态)字段或实例字段。
- Array 允许在执行 get 或 set 访问操作期间进行扩展转换,但如果将发生收缩转换,则抛出一个 IllegalArgumentException。
二、常用方法
public final class Field extends AccessibleObject implements Member
{
//没有构造方法
//返回指定对象上此 Field 表示的字段的值。如果该值是一个基本类型值,则自动将其包装在一个对象中
public Object get(Object obj)
throws IllegalArgumentException,
IllegalAccessException{}
//获取一个静态或实例 boolean 字段的值
public boolean getBoolean(Object obj)
throws IllegalArgumentException,
IllegalAccessException{}
public byte getByte(Object obj)
throws IllegalArgumentException,
IllegalAccessException{}
public char getChar(Object obj)
throws IllegalArgumentException,
IllegalAccessException{}
getShort getInt getLong getFloat getDouble
//将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
public void set(Object obj,
Object value)
throws IllegalArgumentException,
IllegalAccessException{}
public void setBoolean(Object obj,
boolean z)
throws IllegalArgumentException,
IllegalAccessException{}
setByte setChar setShort setInt setLong setFloat setDouble
}
三、示例
package day23;
import java.lang.reflect.*;
public class ReflectDemo {
public static void main(String[] args)
{
ReflectPoint rep = new ReflectPoint(3,5);
Field fieldX = rep.getClass().getField("x");
System.out.println(fieldX);//public int day23.ReflectPoint.x
System.out.println(fieldX.get(rep));//3
//Field fieldY = rep.getClass().getField("y"); 不能访问private
Field fieldY = rep.getClass().getDeclaredField("y");
fieldY.setAccessible(true);//设置访问权限
System.out.println(fieldY.get(rep));
}
}
class ReflectPoint
{
public int x;
private int y;
public ReflectPoint(int x,int y)
{
this.x = x;
this.y = y;
}
}
package day23;
import java.lang.reflect.*;
/**
* 将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的‘b’改成‘a’
*/
public class ReflectDemo {
public static void main(String[] args) throws Exception
{
ReflectPoint rep = new ReflectPoint(3,5);
System.out.println(rep);
changeStringValue(rep);
System.out.println(rep);
}
private static void changeStringValue(Object obj) throws Exception {
Field[] fields = obj.getClass().getFields();
for(Field field : fields)
{
//getType得到字段的类型
if(field.getType() == String.class)
{
String value = (String) field.get(obj);
if(value.contains("b"))
{
value = value.replace("b","a");
field.set(obj, value);
}
}
}
}
}
class ReflectPoint
{
public int x;
private int y;
public String str1 = "abbcd";
public String str2 = "ball";
public String str3 = "ccccc";
public ReflectPoint(int x,int y)
{
this.x = x;
this.y = y;
}
public String toString()
{
return str1+":"+str2+":"+str3;
}
}