反编译类中的属性
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对象的属性不安全