25、反射(一)

2021-04-09  本文已影响0人  爱学习的代代

上面学习了Class类,反射主要是用来获取到类的属性和方法。

几点说明:

  1. 另外一种获取class的方法: 类名.class
        Class clazz = MerchandiseV2.class;

  1. 通过filed获取实例的属性值: countField.get(v) , v代表的是实例化的对象。
        MerchandiseV2 v = new MerchandiseV2(1,"床单",100, 50, 30);
        Field countField = clazz.getField("count");
        System.out.println("通过反射获取一个实例count的值:" + countField.get(v));


  1. 通过field来修改成员变量的值:countField.set(v, 150); v代表是实例化的对象,150代表要传入的值。

  2. 通过filed获取所有的成员变量: clazz.getFields()

实例代码如下:

package day14;

import java.lang.reflect.Field;

public class TestReflect {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        MerchandiseV2 v = new MerchandiseV2(1,"床单",100, 50, 30);


//      另一种获取Class类的方法:
        Class clazz = MerchandiseV2.class;

//      Alt + Enter 解决报错问题
        Field countField = clazz.getField("count");
//      通过反射获取一个实例count的值。

        System.out.println("通过反射获取一个实例count的值:" + countField.get(v));

//      通过反射设置一个实例的成员变量

        countField.set(v, 150);
//      查看设置的成员变量是否发生了变化:
        System.out.println(countField.get(v));
        System.out.println(v.count);




//     class的getFileds方法:获取类的所有的属性。

        Field[] fields = clazz.getFields();
        System.out.println("输出所有的成员变量:");
        for (Field field : fields) {
            System.out.println(field);
        }

    }
}



运行结果:


image.png

附MerchandiseV2的成员变量:


image.png

疑问:

  1. 感觉不好理解,如果要获取的话,怎么不直接使用get、set方法呢?
  2. 观察输出结果,发现仅输出了count,count属性是设置成public才可以获取到的,那么私有属性如何获取呢?
上一篇下一篇

猜你喜欢

热点阅读