随笔,笔记
能够分析类能力的程序称为反射
。
可以用来:
- 在运行时分析类的能力。
- 在运行时查看对象。
- 实现通用的数组操作代码。
- 利用 Method 对象,这个对象很像 C++ 中的函数指针。
学习步骤
反射可以分析类的能力,是怎么分析的呢?是不是可以获得类中的所有信息呢?下面进行学习
- 获得 Class 对象
- 通过 Class 对象 获得类中 字段。
- 通过 Class 对象 获得类中 方法。
- 通过 Class 对象 获得类中 构造方法。
获得对应类的 Class 对象
Class 对象里面保存着 我们获取类的字段,方法,构造方法的方式。有三种 获取 Class 对象的方式。
获取 Class 对象 的方式:
第一种:
// 利用 对象 的 getClass 方法获得
ReflectTest test = new ReflectTest(10);
Class a = test.getClass();
第二种
- 完整类名必须是代表的 类名或 接口名时才能够执行
// 通过完整类名 和 使用 forName() 方法 获得
String s = "com.test.concurrency.ReflectTest";
Class b = Class.forName(s);
第三种
- 基本类型和对象都可以。
// .class 的方式获得
Class c = ReflectTest.class;
Class d = int.class;
数组类型的名称:
System.out.println(Double[].class.getName());
// [Ljava.lang.Double;
获取字段,字段类型,修饰符
字段的信息主要是在 Field 类中,所以我们需要通过 Class 对象获取Field 对象。
// 获取所有 公共字段,也就是 public 修饰的,包括 父类中的 公共 字段
Field[] fields = testClass.getFields();
// 获取所有 本类中的字段,包括公共字段和私有字段,不包括 父类中的字段。
Field[] declaredFields = testClass.getDeclaredFields();
如果知道字段的名字可以 获取 指定名字的 字段信息。
Field a = testClass.getDeclaredField("a");
System.out.println