package com.franky.reflex;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @描述 反射的基本使用实例
* @作者 franky
* @日期 2014-12-30 下午4:08:34
*/
public class ReflexTest {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String className = "com.franky.reflex.Person";
//得到Person类的Class对象,在编译时期,编译器并不知道得到的是哪个类的Class对象,因此需要转换
Class<Person> clazz = (Class<Person>) Class.forName(className);
//得到无参的构造方法
Constructor<Person> consByNullPrams = clazz.getConstructor();
//得到有参的构造方法,参数也是Class对象
Constructor<Person> consByPrams = clazz.getConstructor(int.class,String.class);
//实例化无参的构造方法的对象,可以由构造器实例化,也可以直接用Class对象实例化
consByNullPrams.newInstance();
Person person = clazz.newInstance();
//实例化有参的构造方法对象
Person person2 = consByPrams.newInstance(22,"tom");
//得到成员字段,私有字段需要设置访问权限为true进行访问
Field field = clazz.getDeclaredField("age");
//得到所有声明的字段数组
Field[] fields = clazz.getFields();
//设置访问权限
field.setAccessible(true);
//得到字段所在对象的值
int age = (int) field.get(person2);
System.out.println(age);
//遍历公开的字段并替换其中的字符
for (Field f : fields) {
if(f.getType() == String.class){
String str = (String) f.get(person2);
str = str.replace('a', 'x');
f.set(person2, str);
}
}
System.out.println(person2);
//得到成员方法并调用
Method method = clazz.getMethod("setAge", int.class);
//如果method.invoke(null,args)第一个参数为Null时候,代表调用的是静态方法
method.invoke(person2, 55);
//JDK1.4的调用方式,参数可以是Object数组
method.invoke(person2, new Object[]{66});
System.out.println(person2.getAge());
}
}
Person类
package com.franky.reflex;
/**
* @描述 测试反射的Person类
* @作者 franky
* @日期 2014-12-30 下午5:53:14
*/
public class Person {
private int age;
private String name;
public String str1 = "aaaaaaaaaaaaa";
public String str2 = "bbbbbbaaaaaaa";
public String str3 = "ccccccaaaaaaa";
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
public Person() {
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Person [str1=" + str1 + ", str2=" + str2 + ", str3=" + str3
+ "]";
}
}