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
+ "]";
}
}