一、从 Class 说起
Java 提供了一个 java.lang.Class 类。
在 Object 类中,getClass()
方法用来获取 Class 对象。
例如,我们可以这样来获取 Date 类在运行时的 Class 对象
//Returns the runtime class of this Object.
Class<Date> cls=Date.class;
这里我们可以发现,获取 Class 对象不需要进行实例化。
而对于基本数据类型、接口、数组、枚举类型,Java 都为其提供了获取 Class 的方法。
例如为基本数据可以通过 .class 来获取对应的 Class 对象,
Class<Integer> cls=int.class;
而 Class 类又为我们提供了获取其他信息的方法
但其中最为重要的还是这两个类—— Fields 和 Method。
二、Field
我们可以通过getFields()
方法获取到该类的字段信息。
Field 囊括了 Java 中反射相关的所有类。
例如:
- isAccessible()方法,判断是否有访问的权限。
- isAccessible()方法用来设置 Java 的访问机制,为 true 即表示允许读写非 public 的字段。
- get(Object obj) 方法获取到对应的 value 值。
三、Method
Class 还提供另一个方法—— getMethods(),他可以返回所有的 public 方法,对应的,还有返回所有非 public 方法的 getDeclaredMethods()方法。
通过获取到 Method 我们可以知道到其修饰符、参数、返回值注解等信息。
至此,我们关于 Java 反射的基础类型就介绍完了。我特意画了下面的图,以方便你的理解。
(图)
四、总结
Java 中所有的类/方法/数据类型都实现了 getClass() 或与之相似的方法用来获取 Class。
通过 Class 的 getFields() 或 getMethods() 等方法来使用 Field 或 Method 中的方法。
通过这些方法来动态的获取到 Java 中任意元素的属性值、访问修饰符等其他信息。
Java 反射就这样被实现了。
评论区