学科分类
目录
Java Web

通过反射访问属性

通过反射不仅可以创建对象,还可以访问属性。在反射机制中,属性的操作是通过Filed类实现的,它提供的set()和get()方法分别用于设置和获取属性。需要注意的是,如果访问的属性是私有的,则需要在使用set()或get()方法前,使用Field类中的setAccessible(true)方法将需要操作的属性设置成可以可被外界访问的。

为了帮助大家更好地理解如何通过反射访问属性,接下来,通过一个案例来演示,如例1所示。

例1 ReflectDemo03.java

 1    package cn.itcast.chapter08.reflection;
 2    import java.lang.reflect.Field;
 3    class Person {
 4        private String name;    //定义属性name,表示姓名
 5        private int age;        //定义属性age,表示年龄
 6        public String toString() {    //重写toString()方法
 7            return "姓名:"+this.name+",年龄:"+this.age;
 8        }
 9    }
 10    public class ReflectDemo03 {
 11        public static void main(String[] args) throws Exception{
 12            //获取Person类对应的Class对象
 13            Class clazz = Class.forName("cn.itcast.chapter08.reflection.Person");
 14            //创建一个Person对象
 15            Object p = clazz.newInstance();
 16            //获取Person类中指定名称的属性
 17            Field nameField = clazz.getDeclaredField("name");
 18            //设置通过反射访问该属性时取消权限检查
 19            nameField.setAccessible(true);
 20            //调用set方法为p对象的指定属性赋值
 21            nameField.set(p, "李四");
 22            //获取Person类中指定名称的属性
 23            Field ageField = clazz.getDeclaredField("age");
 24            //设置通过反射访问该属性时取消权限检查
 25            ageField.setAccessible(true);
 26            //调用set方法为p对象的指定属性赋值
 27            ageField.set(p, 20);
 28            System.out.println(p);
 29        }
 30    }

运行结果如图1所示。

图1 运行结果

在例1中,第3~9行代码定义了一个Person类,类中定义了两个私有属性name和age。第10~30行代码定义了ReflectDemo03类,其中第19行代码用于取消访问属性时的权限检查,第20行代码用于调用set方法为对象的指定属性赋值。

点击此处
隐藏目录