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