/*
* 反射获取构造方法并使用。
*
* 构造方法 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);
public Field[] getDeclaredFields()
throws SecurityException返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。
public Field[] getFields()
throws SecurityException返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。