通过反射访问对象和属性

思路
  1. 先通过Class.forName()方法获取类
  2. 通过获取的类来 ,进行创建(new)对象。
    3.通过获取Class.forName()获取类然后调用其方法或获取属性Field ------getDeclaredField()方法获取Field 属性。
    getDeclaredFields()方法获取整个类中的所有的属性(除了私有的)
  3. 获取类的属性后调用Field中方法,来获取相应的属性getDeclaredField(“name”),参数属性名称,该方法返回符号该属性名称,最后调用 返回的Field 调用set(要修改的对象,修改的数据),进行修改对象的变量
  4. 私有属性的修改要先,调用 Filed中setAccessible(true)方法 修改属性的修饰符访问权限,但同时破坏了属性的封装性,后面跟前面的操作一样

Student类

public class Student {

    public    String name;
    protected int    no;
    private   boolean  sex;
    int weight;

    public Student() {
    }
}

Test

public class FieldTest02 {
    public static void main(String[] args){
//         平时方法 访问对象的 属性并修改
//        先把学生对象创建出来
        Student s=new Student();
//        通过  引用.属性来访问对象的属性
        s.name="xiaoMing";
        System.out.println(s.name);


        try {
            //        通过反射 获取类
            Class c=Class.forName("TTTT.Student");
            //同过获得的类  创建对象
            Object o=c.newInstance();
            /*通过Class 中方法getDeclaredField(String name)
            * 来获取Class 中 某个属性
            * */
           Field name= c.getDeclaredField("name");
           /*获取该属性name后通过 get方法传入 对象,获取该对象的相应属性
           * */
            System.out.println(name.get(o));
            /*   第一要素  : 要修改的对象o
                 第二要素: 要修改的属性 name
                 第三要素: 要赋值的内容
               与前面进行 比较  s.name="xiaoMing";
            * */
            name.set(o,"Test");
            System.out.println(name.get(o));


            //访问私有属性

//            获取Class类中 的sex属性
          Field sex= c.getDeclaredField("sex");

//          sex.get(o);直接访问会报出异常IllegalAccessException没有访问权限

//            通过 获取类的属性  修改属性的权限 ,同时破坏了属性的封装
            sex.setAccessible(true);
//            修改set
            sex.set(o,true);
            System.out.println(sex.get(o));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值