java 利用反射机制暴力破解String构造器String(char[] value, boolean share)分析和实现

前言

         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对象

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值