黑马程序员-JAVA反射2

反射就是把Java类中的各种成分映射成相应的java类,例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造,函数,包等等信息

也用一个个的Java 类表示。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造函数,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field,Method,Contructor,Package等等。

一个类中的每个成员都可以用的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象后,得到这些实例对象后的使用,就是反射的要点。

 

Constructor类:

Constructor类代表某个类中的一个构造方法。

得到某个类所有的构造方法:

例: Constructor constructors[]=Class.forName("java.lang.String").getConstructors();

得到某一个构造方法:

例:Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class));

获得方法时要到类型

创建实例对象

通常方式:String str=new String(New StringBuffer("abc");

反射方式:String str=(String)constructor.newInstance(new StringBuffer("abc"));

调用获得的方法时要用到类型。

Class类也有一个newInstance()方法,这个方法可以让使用者可以不用通过getConstructor得到构造方法,就可以使用,但仅能使用无参的构造方法。

Field类:

Field 类代表某个类中的一个成员变量

例:

ReflectTest.java

/**
*@Package:laladin.learn
*@Project:javaLearn
*@Title:ReflectTest.java
*@Description:TODO
*@author Topdog topdog@163.com
*@date 2011-7-9下午06:09:27
*@version v1.0
*/
package laladin.learn;

import java.lang.reflect.Field;

/**
 * @ClassName:ReflectTest
 * @Description TODO
 * @date 2011-7-9
 */
public class ReflectTest {

	/**
	 * @throws Exception 
	 * @Title:main
	 * @Description:TODO
	 * @Param:@param args
	 * @Return:void
	 * @throws
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		ReflectPoint pt1=new ReflectPoint(3,5);
		Field fieldY=pt1.getClass().getField("y");//getField只能得到可见的成员变量
		Field fieldX=pt1.getClass().getDeclaredField("x");//这样可以得到任何成员变量
		System.out.println(fieldY.get(pt1));
		fieldX.setAccessible(true);//设置权限可以访问
		System.out.println(fieldX.get(pt1));//这样才能访问到私有成员变量
		
		//以下这个方法用于改变成员变量值的测试
		changeStringValue(pt1);
		System.out.println(pt1.toString());
	}

	/**
	 * @throws Exception 

	* @Title:changeStringValue
	* @Description:TODO
	* @Param:
	* @Return:void
	* @throws
	*/
	private static void changeStringValue(Object obj) throws Exception {
		// TODO Auto-generated method stub
		Field[] fields=obj.getClass().getFields();
		for(Field field:fields){
			if(field.getType()==(String.class)){
				String oldValue=(String)field.get(obj);
				String newValue=oldValue.replace('b', 'a');
				field.set(obj, newValue);
			}
		}
	}

}

ReflectPoint.java

/**
*@Package:laladin.learn
*@Project:javaLearn
*@Title:ReflectPoint.java
*@Description:TODO
*@author Topdog topdog@163.com
*@date 2011-7-9下午06:07:02
*@version v1.0
*/
package laladin.learn;

/**
 * @ClassName:ReflectPoint
 * @Description 反射演示,Field
 * @date 2011-7-9
 */
public class ReflectPoint {
	private int x;
	public int y;
	//下面三个成员变量用于测试如下题目:
	//将任意一个对象中的所有String类型成员变量中的字符串内容的"b"改成"a"
	public String str1="ball";
	public String str2="basketball";
	public String str3="laladin";
	/**
	* <p>Title:</p>
	* <p>Description:</p>
	*@param x
	*@param y
	*/
	public ReflectPoint(int x, int y) {
		super();
		this.x = x;
		this.y = y;
		
	}
	/* (non-Javadoc)
	 * <p>Title:toString</p>
	 * <p>Description:<p>
	 * @return
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return str1+":"+str2+":"+str3;
	}

}



 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值