码迷,mamicode.com
首页 > 编程语言 > 详细

java基础巩固系列(三):成员变量反射的Field类

时间:2014-08-22 21:09:19      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:field   反射   setaccessible   

要想使用反射,首先需要获得类对象所对应的Class类的类对象。一个Field对象对应的是一个反射类的属性(成员变量)信息


这里边有一个方法Field.setAccessible(Boolean b),这个方法很重要,在代码里边有注释,是用来提高java反射速度的。

首先,我们需要定义一个javaBean,这个bean用来作为我们的反射类:

<span style="font-family:Microsoft YaHei;font-size:12px;">package com.test;

public class Point {
	private int x;
	public int y;
	
	public Point(int x,int y){
		super();
		this.x = x;
		this.y = y;
	}
}
</span>
然后,我们就在main里边写具体的反射方法了:

<span style="font-family:Microsoft YaHei;font-size:12px;">package com.test;

import java.lang.reflect.Field;


public class ReflectTest {
	public static void main(String []args) throws Exception{
		Point pt1 = new Point(3, 5);
		
		//这里的得到的fieldY是类上的一个字段(成员变量),不是实例pt1上的y的值
		Field fieldY = pt1.getClass().getField("y");
		System.out.println(fieldY); //输出结果:public int com.test.Point.y
		int num = fieldY.getInt(pt1); //这里得到的是pt1实例上边的变量y的值
		System.out.println(num); //输出结果:5
		
		
		//因为成员变量x是private的,所以按照如上的方法是不能够取得x的值的
		//因为我们需要用到暴力反射
		Field fieldX = pt1.getClass().getDeclaredField("x"); 
		//这里的getDeclaredField()方法,是获得类上的字段,无论是公有还是私有的
		
		fieldX.setAccessible(true);
		/**将此对象的 accessible 标志设置为指示的布尔值。
		 * 值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
		*/
		//PS:setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问
		//通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的
		System.out.println(fieldX.get(pt1));
	}
}

</span>
注意,在上边对类私有成员变量x反射的时候会用到setAccessible()方法,对此在代码里边有具体的解释。


我们下边做一个反射的小李子,就是通过反射技术把另一个类中的String类型成员变量中字符为‘b‘的改变为‘a‘

<span style="font-family:Microsoft YaHei;font-size:12px;">package com.test;

public class Point {
	public String s1="ball";
	public String s2 = "basketball";
	public String s3="lipenglong";

}
</span>

下边是main函数

<span style="font-family:Microsoft YaHei;font-size:12px;">package com.test;

import java.lang.reflect.Field;


public class ReflectTest {
	public static void main(String []args) throws Exception{
		Point pt1 = new Point();
		
		//首先得到所有方法的一个Field数组
		Field[] fields = pt1.getClass().getFields();
		
		for(Field field : fields){
			//首先要判断得到的类型是不是String
			if(field.getType() == String.class){
				//把原本的变量值赋给oldValue
				String oldValue = (String)field.get(pt1);
				//把oldValue中字符为b的转换为字符为a
				String newValue = oldValue.replace('b', 'a');
				//给pt1赋新的值
				field.set(pt1, newValue);
			}
		}
		
		System.out.println(pt1.s1);
		System.out.println(pt1.s2);
		System.out.println(pt1.s3);
		
	}
}



</span>

得到的结果为:

aall
aasketaall
lipenglong





java基础巩固系列(三):成员变量反射的Field类

标签:field   反射   setaccessible   

原文地址:http://blog.csdn.net/u010800530/article/details/38759941

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!