比如以下代码,暴力访问是取消对权限的检查,但是尽量不要这样用,因为明明私有了还要访问会产生安全隐患。
public class ReflectDemo2 {
private static String person_string = "cn.itcast.c.bean.Person";
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
getPrivateFieldDemo();
}
/*
* 获取私有字段。
*/
private static void getPrivateFieldDemo() throws Exception {
Class clazz = Class.forName(person_string);
Field field = clazz.getDeclaredField("age");
// System.out.println(field);
Object obj = clazz.newInstance();
// 取消对权限的检查。暴力访问
field.setAccessible(true);
field.set(obj,68);
Object value = field.get(obj);
System.out.println("value="+value);
}
public static void getPublicFieldDemo() throws Exception {
Class clazz = Class.forName(person_string);
Field field = clazz.getField("name");
//获取字段值。但是对于非静态的字段必须要有所属的对象。
// 既然需要该类对象,就可以通过Class类中的newInstance方法来完成。该类实例的创建。
Object obj = clazz.newInstance();
//给指定字段赋值。
field.set(obj,"旺财");
Object value = field.get(obj);
System.out.println("value="+value);
}
/*
* 获取指定名称的字段。
*/
/*
* 获取指定的字节码文件中的属性。字段.
*/
public static void getFieldsDemo() throws ClassNotFoundException {
// 1,获取指定名称字节码文件对象。
Class clazz = Class.forName(person_string);
// 2,通过该字节码文件对象的方法获取字节码文件中的字段
Field[] fields = clazz.getFields();
fields = clazz.getDeclaredFields();
for(Field field : fields){
System.out.println(field);
}
}
}
|