反射
4个对象
-
Class:class 文件
获取 Class 方法
类.class、对象.getClass()、Class.forName("全限定类名") -
Field:成员变量
-
Method:成员方法
-
Constructor:构造方法
Class 常用 API
| 作用 | 方法 | 说明 |
|---|---|---|
| 获取类全限定名 | clazz.getName()、`clazz.getCanonicalName() | 如果内部类,这俩方法返回值有区别 |
| 获取类名 | clazz.getSimpleName() | |
| 是否是接口 | clazz.isInterface() | |
| 获取实现的接口 | clazz.getInterfaces() | 所有接口,多层 |
| 获取父类 | clazz.getSupercalss() | 直接父类(爷爷辈的获取不了) |
| 使用无参构造创建实例 | clazz.newInstance() | 没有无参构造会报错 |
| 获取字段 | clazz.getFields() clazz.getField(字段名) clazz.getDeclaredFields() clazz.getDeclaredField(字段名) |
带 Declared:能获取私有、但不包括继承 不带 Declared:只能获取 public,但包括继承 |
| 获取方法 | clazz.getMethods() clazz.getMethod(方法名, 可变参数) clazz.getDeclaredMethods() clazz.getDeclaredMethod(方法名, 可变参数) |
参数是可变参数,可传任意类型的 classclazz.getMethod("draw", int.class, String.class) |
Field 常用 API
| 作用 | 方法 | 说明 |
|---|---|---|
| 暴力反射 | setAccessible(true) | private 字段不能调用 get 和 set,暴力反射后可以 |
| 修改属性值 | set(目标对象, 值) | 对于 final 字段不会报错,但实际上该字段的值不会改变 |
| 获取属性值 | get(目标对象) | |
| 获取属性名称 | getName() | |
| 获取属性类型 | getType() | 是一个 Class 对象 |
| 属性是否是枚举 | isEnumConstant() |
Method 常用 API
| 方法 | 作用 | |
|---|---|---|
| 执行方法 | invoke(目标对象, 可变参数) | |
| 获取方法返回值 | getReturnType() | 是一个 Class 对象 |
