反射就是把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;
}
}