import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/*
* 反射获取构造方法并使用。
*
* 构造方法 Constructor
* 成员变量 Field
* 成员方法 Method
*
*
*/
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException,
NoSuchMethodException, SecurityException, InstantiationException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException {
// 获取字节码文件对象
Class c = Class.forName("cn.itcast_01.Person");
// 获取构造器对象
// 所有公共构造方法
// public Constructor<?>[] getConstructors()
// Constructor[] cons = c.getConstructors();
// 所有构造方法
// public Constructor<?>[] getDeclaredConstructors()
// Constructor[] cons = c.getDeclaredConstructors();
// for (Constructor con : cons) {
// System.out.println(con);
// }
// 一般我们创建对象,只要一个构造方法就可以了,所以,我们只需要获取一个构造方法即可。
// 我先以无参数构造方法举例
// public Constructor<T> getConstructor(Class<?>... parameterTypes)
Constructor con = c.getConstructor();// 表示我使用的是无参数构造方法
// 通过构造器对象创建对象
// public T newInstance(Object... initargs)
Object obj = con.newInstance();
System.out.println(obj);
}
}
/*
* 获取私有成员变量并使用。
*/
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
// 获取字节码文件对象
Class c = Class.forName("cn.itcast_01.Person");
// 创建对象
Constructor con = c.getConstructor();
Object obj = con.newInstance();
// 赋值前
System.out.println(obj);
// 获取年龄并赋值
Field ageField = c.getField("age");
ageField.set(obj, 26);
// 获取姓名并赋值
// NoSuchFieldException
// Field nameField = c.getField("name");
Field nameField = c.getDeclaredField("name");
// IllegalAccessException
//public void setAccessible(boolean flag)
//暴力访问
nameField.setAccessible(true);//你就不要限制我了。
nameField.set(obj, "林青霞");
// 赋值后
System.out.println(obj);
}
}
|