反射javabean

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;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章