38、java.lang.reflect.Field

一、Field

 

  1. Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。
  2. 反射的字段可能是一个类(静态)字段或实例字段。 
  3. 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;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值