前言
java String类的构造器如下,它的访问权限修饰符为default,下面将利用java的反射机制来获取到该构造器并且最终通过暴力破解完成对象的实例化。
情况一
1.获取String类的字节码对象
2.获取构造方法
3.调用Class下静态方法newInstance来实例化对象
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//获取String类的字节码对象
Class<String> clz = String.class;
//获取构造方法
Constructor<String> c = clz.getConstructor(char[].class,boolean.class);
//给定值并且执行有参构造
//newInstance--Class下静态方法来实例化对象以便操作
String str = c.newInstance(new char[]{'1','a'},true);
//java.lang.NoSuchMethodException
System.out.println(str);
}
运行结果:抛出java.lang.NoSuchMethodException,无法完成实例化操作
情况二
1.获取String类的字节码对象
2.调用getDeclaredConstructor()方法,获取到default修饰的构造器
3.调用Class下静态方法newInstance来实例化对象
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//获取String类的字节码对象
Class<String> clz = String.class;
//调用getDeclaredConstructor()方法,可获取到类的私有构造器(包括带有其他修饰符的构造器)
Constructor<String> clz1 = clz.getDeclaredConstructor(char[].class,boolean.class);
//因为访问修饰符为默认default,所以指向实例化后没有访问权限
//IllegalAccessException
String str = clz1.newInstance(new char[]{'1','a'},true);
System.out.println(str);
}
运算结果:出现java.lang.IllegalAccessException异常,说明default修饰的构造方法指向实例化后没有访问权限
情况三
1.获取String类的字节码对象
2.调用getDeclaredConstructor()方法,获取到default修饰的构造器
3.暴力破解 clz1.setAccessible(true);
4.调用Class下静态方法newInstance来实例化对象
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//获取String类的字节码对象
Class<String> clz = String.class;
//调用getDeclaredConstructor()方法,可获取到类的私有构造器(包括带有其他修饰符的构造器)
Constructor<String> clz1 = clz.getDeclaredConstructor(char[].class,boolean.class);
//暴力破解
clz1.setAccessible(true);
String str2 = clz1.newInstance(new char[]{'1','a'},true);
System.out.println(str2);
}
运行结果:实例化成功
小结:
1.newInstance--Class下静态方法用来实例化对象以便操作
2.Class类的getDeclaredConstructor()方法,可获取到类的所有构造器,但在使用时private的构造 器时,必须设置setAccessible()为true,暴力破解后才可以获取并操作该Constructor对象