反射机制反编译类

反编译类中的属性

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Main {
    public static void main(String[] args) {
        //获取到整个类
        Class c2 = Student.class;

        //获取所有public修复的属性
        //Field[] fields = c2.getFields();

        //获取所有的属性
        Field[] fields1 = c2.getDeclaredFields();
        for (Field fs : fields1) {
            System.out.println(Modifier.toString(fs.getModifiers()));
            System.out.println(fs.getType().getSimpleName());
            System.out.println(fs.getName());
            System.out.println("-----");
            
            /*
                private
                String
                studentNo
                -----
                public
                int
                age
                -----
                protected
                String
                addr
                -----
                
                boolean
                sex
                -----
             */
        }
    }
}

其中,Student类如下:

public class Student {
    private  String studentNo;
    public int age;
    protected String addr;
    boolean sex;
}

我可以将上述代码中

Class c2 = Student.class;

改为

Class c2 = Date.class;

我就可以获取到
Date类中的所有属性,这便是反编译的套路。

************************************************************

通过这次学习,要学会慢慢掌握查阅官方API文档,例如,上述代码中

Modifier.toString(fs.getModifiers())

fs.getModifiers()获取到属性的修饰符,其返回值是int类型的(可查看源代码验证)

Modifier.toString()方法将int类型转换为String类型修饰符,如public等

 

给属性设值、取值操作:

        //获取到某一个属性
        Field studentNoField = c2.getDeclaredField("studentNo");
        //新建一个具体的对象
        Object o = c2.newInstance();
        //为studentNo设值
        studentNoField.set(o,"001");
        //取值
        System.out.println(studentNoField.get(o)); //报错

由于studentNo这个属性是private修饰的,所以不能进行set、get操作。

通过以下操作,即可访问

        //获取到某一个属性
        Field studentNoField = c2.getDeclaredField("studentNo");
        //新建一个具体的对象
        Object o = c2.newInstance();
        
        //打破封装,将studetNo这个属性设置为可访问的
        studentNoField.setAccessible(true);
        
        //为studentNo设值
        studentNoField.set(o,"001");
        //取值
        System.out.println(studentNoField.get(o)); //001

所以说,反射机制可以打破封装性,导致Java对象的属性不安全

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值