公共构造方法:public renxixao.Person(java.lang.String,int,java.lang.String)
公共构造方法:public renxixao.Person()
所有构造方法:public renxixao.Person(java.lang.String,int,java.lang.String)
所有构造方法:public renxixao.Person()
Person [name=null, age=0, address=null]
show
/*
* 通过反射去获取该构造方法并使用:
* public Person(String name, int age, String address)
*/
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
// 获取字节码文件对象
Class c = Class.forName("renxixao.Person");
// 获取带参构造方法对象
// public Constructor<T> getConstructor(Class<?>... parameterTypes)
Constructor con = c.getConstructor(String.class, int.class,
String.class);
// 通过带参构造方法对象创建对象
// public T newInstance(Object... initargs)
Object obj = con.newInstance("小明", 27, "北京");
System.out.println(obj);
}
}
Person [name=小明, age=27, address=北京]
通过反射获取私有构造方法并使用
/*
* 需求:通过反射获取私有构造方法并使用
* private Person(String name){}
*/
public class ReflectDemo3 {
public static void main(String[] args) throws Exception {
// 获取字节码文件对象
Class c = Class.forName("renxixiao.Person");
// 获取私有构造方法对象
// NoSuchMethodException:每个这个方法异常
// 原因是一开始我们使用的方法只能获取公共的,下面这种方式就可以了。
Constructor con = c.getDeclaredConstructor(String.class);
// 用该私有构造方法创建对象
// IllegalAccessException:非法的访问异常。
// 暴力访问
con.setAccessible(true);// 值为true则指示反射的对象在使用时应该取消Java语言访问检查。
Object obj = con.newInstance("小明");
System.out.println(obj);
}
}
获取私有构造时必须设置 con.setAccessible(true) 否则出现 IllegalAccessException:非法的访问异常。
通过反射获取获取成员变量并使用
/*
* 通过发生获取成员变量并使用
*/
public class ReflectDemo {
public static void main(String[] args) throws Exception {
// 获取字节码文件对象
Class c = Class.forName("renxixiao.Person");
// 获取所有的成员变量
Field[] fields = c.getFields(); // 获取全部的成员变量
Field[] declaredFields = c.getDeclaredFields(); // 获取私有的成员变量
for (Field field : fields) {
System.out.println("公共的成员变量"+field);
}
for (Field field : declaredFields) {
System.out.println("私有的成员变量"+field);
}
// 通过无参构造方法创建对象
Constructor con = c.getConstructor();
Object obj = con.newInstance();
// 获取单个的成员变量
// 获取address并对其赋值
Field addressField = c.getField("address");
// public void set(Object obj,Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
addressField.set(obj, "北京"); // 给obj对象的addressField字段设置值为"北京"
System.out.println(obj);
// 获取name并对其赋值
// NoSuchFieldException
Field nameField = c.getDeclaredField("name");
// IllegalAccessException
nameField.setAccessible(true);
nameField.set(obj, "小明");
System.out.println(obj);
// 获取age并对其赋值
Field ageField = c.getDeclaredField("age");
ageField.setAccessible(true);
ageField.set(obj, 27);
System.out.println(obj);
}
}