反射 》反射就是把java类中的各种成分映射成相应的java类; 例如:一个java类中用一个class类得对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等信息也用一个个的java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等也是一个个类。表示java类得Class类显然要提供一些列的方法,来获取其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类得实例对象来表示,他们是Field,Method,Contructor,Package等等 >一个类中的每个成员都可以用相应的反射API类得一个实例对象来表示。通过调用Class类得方法可以得到这些实例对象后,得到这些实例对象有什么用?怎么用?这正是学习和应用反射的要点。
下面通过一个事例来说明Constructor(构造方法)反射
得到某个类得构造方法 例子:Constructor [] constructor = Class.forName(“java.lang.String”).getConstructors(); 得到某一个构造方法 例子:Constructor constructor= Class.forName(“java.lang.String”).getConstructors(StringBuffer.class) 获得方法时要用到类型 创建实例对象 通常方式:String str = new String(new StringBuffer(“abc”)); 反射方式:String str = (String)constructor.newInstance(new StringBuffer(“abc”)); 调用获得的方法时,要用到上面相同类型的实例对象
实例:
这是个JavaBean类
class Person
{
private String name;
private int age;
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//利用反射获得构造方法(构造方法参数什么样,反射就要穿相应的.class参数)
Constructor constructor = Person.class.getConstructor(String.class,int.class);
//通过构造方法获得相应的实例
Person person = (Person)constructor.newInstance("zhangsan",25);
//调用实例的setName()方法;这里是姐姐调用了JavaBean的方法赋值
person.setName("万利");
/**
* 利用反射原理直接给age赋值
* 定义变量为Person中的字段age;
* 获得属性 PropertyDescriptor
*/
String propertyName = "age";//该字段不能随便写,要给那个赋值或者改变那个,就是那个字段
//获得相应的属性
PropertyDescriptor pd = new PropertyDescriptor(propertyName,person.getClass());
//调用方法
Method methodSetAge = pd.getWriteMethod();
//给属性赋值
methodSetAge.invoke(person,27);
//验证是否成功
System.out.println(person.getName()+":"+person.getAge());
|