1. 反射获取私有构造方法并且使用:
(1)获取字节码文件.class对象:
Class c = Class.forName("cn.itcast_01.Person");
(2)获取私有构造方法对象
//Constructor con = c.getConstructor(String.class);这个方法是获取公共构造器,而这是私有构造,所以报错:NoSuchMethodException
//Constructor con = c.getDeclaredConstructor(String.class);这个方法是获取所有构造器(当然包括私有构造器),但是还是会报错如下:
IllegalAccessException,异常说明是访问的构造器是私有的,我们不能访问。
该怎么办呢?这里只有使用暴力访问:
Constructor con = c.getDeclaredConstructor(String.class);
con.setAccessible(true);//true,则表示反射的对象正在使用时候,应该取消java语言的访问检查。
Object obj = con.newInstance("风清扬");
System.out.println(obj);
package cn.itcast_02; import java.lang.reflect.Constructor; /*
* 需求:通过反射获取私有构造方法并使用
* private Person(String name){}
*
* Person p = new Person("风清扬");
* System.out.println(p);
*/
public class ReflectDemo3 {
public static void main(String[] args) throws Exception {
// 获取字节码文件对象
Class c = Class.forName("cn.itcast_01.Person"); // 获取私有构造方法对象
// NoSuchMethodException:每个这个方法异常
// 原因是一开始我们使用的方法只能获取公共的,下面这种方式就可以了。
Constructor con = c.getDeclaredConstructor(String.class); // 用该私有构造方法创建对象
// IllegalAccessException:非法的访问异常。
// 暴力访问
con.setAccessible(true);// 值为true则指示反射的对象在使用时应该取消Java语言访问检查。
Object obj = con.newInstance("风清扬"); System.out.println(obj);
}
}