`
tianna55555
  • 浏览: 4713 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

JAVA技术之——反射 学习笔记-2 Field

阅读更多
JAVA反射机制定义:
  JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

本笔记讲述如何使用反射获取一个类的所有字段并改变其内容。
import java.lang.reflect.Field;

/**
 * JAVA反射的演示2
 * 本测试类演示Filed属性字段的反射
 * 		--1 调用一个类的公开字段输出信息并改变其值
 * 		--2 调用一个类的私有字段输出信息并改变其值
 * 		--3 调用一个类的静态字段输出信息并改变其值
 * @author Eric
 *
 */
public class ReflectDemo2Field {
	public static void main(String args[]) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
		ReflectDemo2FieldBeanClass demo = new ReflectDemo2FieldBeanClass();//测试用类
	
		Class testC1=demo.getClass();
		Field[] fs = testC1.getDeclaredFields();//与getFields区别是,getFields只能访问公开属性
		
		
		//--1 调用一个类的公开字段输出信息并改变其值
		Field f1 = testC1.getDeclaredField("publicField");
		outField(f1,demo);
		System.out.println("---------------内容改变后--------------");
		f1.set(demo, "publicField"); //改变其值
		outField(f1,demo);
		System.out.println("---------------测试结束--------------");
		
		//--2 调用一个类的私有字段输出信息并改变其值
		Field f2 = testC1.getDeclaredField("privateField");
		f2.setAccessible(true);//访问有权限的字段时,需使用此方法设置访问性,否则会因为权限不够无法访问。
		outField(f2,demo);
		System.out.println("---------------内容改变后--------------");
		f2.set(demo, "privateField");
		outField(f2,demo);
		System.out.println("---------------测试结束--------------");
		
		//--3 调用一个类的静态字段输出信息并改变其值
		Field f3 = testC1.getDeclaredField("staticField");
		outField(f3,demo);
		System.out.println("---------------内容改变后--------------");
		f3.set(demo, "staticField");
		outField(f3,demo);
		System.out.println("---------------测试结束--------------");
		
	}
	
	public static void outField(Field f1,Object obj){
        Field field = f1;
        System.out.println("名称为:"+field.getName());
        Class fieldType = field.getType();
        System.out.println("类型为:"+fieldType.getName());
        Object data=null;
		try {
			data = field.get(obj);//输出字段值
		} catch (IllegalArgumentException | IllegalAccessException e) {
			e.printStackTrace();
		}
        System.out.println("内容为:"+data.toString());
	}
}



测试结果如下:
  • 名称为:publicField
    类型为:java.lang.String
    内容为:原始数据Public字段
    ---------------内容改变后--------------
    名称为:publicField
    类型为:java.lang.String
    内容为:publicField
    ---------------测试结束--------------
  • 名称为:privateField
    类型为:java.lang.String
    内容为:原始数据private字段
    ---------------内容改变后--------------
    名称为:privateField
    类型为:java.lang.String
    内容为:privateField
    ---------------测试结束--------------
  • 名称为:staticField
    类型为:java.lang.String
    内容为:原始数据static字段
    ---------------内容改变后--------------
    名称为:staticField
    类型为:java.lang.String
    内容为:staticField
    ---------------测试结束--------------


测试模型如下:

/**
 * 用于测试反射的bean class
 * 
 * @author Eric
 * 
 */
public class ReflectDemoBeanClass {
	public String publicField = "原始数据Public字段";
	private String privateField = "原始数据private字段";
	static String staticField = "原始数据static字段";

}


作业:试试写出可以输出任意一个类的所有字段的toString方法的方法。
参考答案1:
	/**
	 * 一次性输出所有字段的值
	 */
	public String toString() {
		Class cl = this.getClass();
		Field[] fs = cl.getDeclaredFields();
		StringBuilder str = new StringBuilder();
		str.append("类" + cl.getName() + "\t 内部属性与值如下:\n");
		for (Field f : fs) {
			str.append(f.getName() + " : ");
			try {
				str.append(f.get(this).toString());
			} catch (IllegalArgumentException | IllegalAccessException e) {
				str.append("null");
			}
			str.append("\n");
		}
		str.append("----------------模型描述完成----------------");
		return str.toString();
	}
0
8
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics