反射
1.1简介
- 定义:java语言中一种动态访问、检测修改它本身的能力
- 作用:
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 应用:
- 通过使用类全名创建类实例来使用外部用户定义的类
- 开发类浏览器和智能IDE
- 在测试工具中用于检测类的内部结构
- 在框架开发中用于实现配置信息的处理
- 实现Java的动态代理
1.2使用方法
- 主要通过java.lang.Class类来实现
java.lang.Class
类
- 定义:java.lang.Class类是反射机制的基础
- 作用:存放着对应类型对象的 运行时信息
- 实现步骤:
- 获取 目标类型的Class对象
- 通过 Class 对象分别获取Constructor类对象、Method类对象 & Field 类对象
- 通过 Constructor类对象、Method类对象 & Field类对象分别获取类的构造函数、方法&属性的具体信息,并进行后续操作
- 获取Class实例的三种方法:
- 对象.getClass()
- 类型名.class
- Class.forName()
- 使用Class实例创建对象
Phone instance1 = (Phone) clazz1.newInstance();
Constructor<?>[] cons = clazz1.getConstructor();
Phone instance2 = cons[0].newInstance();
Phone instance3= cons[1].newInstance("s1","s2");
Class<?> c = Class.forName(className);
Field field = c.getField(fieldName);
Class typeClass = field.getType();
Type type = field.getGenericType();
注解
- 定义:一种元数据形式,提供有关程序的数据,该数据不属于程序本身。注释对其注释的代码的操作没有直接影响。
- 用途:
- 编译检查
- 在反射中使用Annotation
- 根据Annotation生成帮助文档
- 能够帮忙查看代码
- 内置注解
@Override
检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。@Deprecated
标记过时方法。如果使用该方法,会报编译警告。@SuppressWarnings
指示编译器去忽略注解中声明的警告
- 自定义注解
@interface
public @interface MyTestAnnotation {
注解属性 [default 默认值]
}