暴力反射_40

什么是暴力反射?

指可以将程序中的私有的属性或者方法通过反射技术,暴力的获取到资源。需要使用的常见方法如下:
在这里插入图片描述

暴力反射获取变量名并修改变量名

类:

class Hospital00007{
    private String name="常熟第一人民医院";
    private int num= 138;
    private void run(String name,int num){
        System.out.println(name+"有:"+num+"人");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

方法

private static void method01() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Class<?> clazz =Class.forName("Hospital00007");         //创建字节码对象(参数:类的全限定名)
        Hospital00007 hospital =(Hospital00007) clazz.newInstance();  //创建实例对象
        // 修改变量名前
        Field[] fields =clazz.getDeclaredFields();                      //获取变量名
        for(Field f :fields){
            f.setAccessible(true);
            System.out.println(f.getName()+"="+f.get(hospital));        //获取变量名 和 变量值
        }
        System.out.println(fields[0].get(hospital)+"="+fields[1].get(hospital));

        System.out.println("*********************************************************");
        //修改变量名后
        fields[0].set(hospital,"苏州广慈医院");
        fields[1].set(hospital,99);
        for(Field f :fields){
            System.out.println(f.getName()+"="+f.get(hospital));
        }
        System.out.println(hospital.getName()+"="+fields[1].get(hospital));
    }

在这里插入图片描述

暴力反射获取类中的所有方法并执行指定的方法

private static void method02() throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException {
        Class<?> clazz =Class.forName("Hospital00007");         //创建字节码对象(参数:类的全限定名)
        Hospital00007 hospital =(Hospital00007) clazz.newInstance();  //创建实例对象
        //获取方法
        Method[] methods =clazz.getDeclaredMethods();       //暴力反射获取所有的方法
        for (Method m :methods){
            m.setAccessible(true);                          //设置方法的权限设置为可见可操作
            System.out.println(m.getName());                //获取方法名

        }
        /**
         * invoke  参数为(Hospital的实例对象,   run方法中的参数值)
         */
        methods[0].invoke(hospital,"苏州九龙医院",899); //执行Hospital类中的run方法
    }

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值