package question2;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/*
* 定義一個標準的JavaBean,名叫Person,包含屬性name、age。
* 使用反射的方式創建一個實例、調用構造函數初始化name、age,
* 使用反射方式調用setName方法對名稱進行設置,
* 不使用setAge方法直接使用反射方式對age賦值。
*/
public class ReflectBean
{
public static void main(String[] args) throws Exception
{
Class pclass = Person.class;
//通過Person類的字節碼文件反射出構造方法
Constructor constructor = pclass.getConstructor(new Class[]{String.class,int.class});
//確認下構造方法是否正確
System.out.println(constructor.toGenericString());
//通過上邊的構造方法來創建一個person實例
//名字是張三,年齡15歲
Person person = (Person) constructor.newInstance(new Object[]{"zhangsan",15});
//測試下結果
System.out.println(person.getName()+" "+person.getAge());
//通過字節碼文件拿到person的setName方法
Method setName = pclass.getMethod("setName", new Class[]{String.class});
//測試結果
System.out.println(setName.toGenericString());
//調用person的setname方法,將zhangsan改成lisi
setName.invoke(person, new Object[]{"lisi"});
System.out.println(person.getName());
//不用getField是因爲它只能返回公共成員
//一但訪問私有成員會拋異常
Field name = pclass.getDeclaredField("age");
//屏蔽name字段的訪問權限檢查
name.setAccessible(true);
//從新設置person的age屬性爲20
name.set(person, 20);
//zhangsan 15 成功變成 lisi 20
System.out.println(person.getName() + " " + person.getAge());
}
}
class Person
{
private String name;
private int age;
public Person(String name, int age)
{
setName(name);
setAge(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;
}
}
反射javabean
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.