注解概述
- Annotation注解,也叫元数据。
- 作用:编写文档、代码分析、编译检查。现在开发中,用注解替换xml配置文件。
- 格式:“@注释名”,还可以添加一些参数值。通过反射机制编程实现对这些元数据的访问。
基本内置注解
- @Override:需要重写
- @Deprecated:不建议使用
- @SuppresWarnings:有参数,去掉程序中的警告
注解声明、本质和成员
- 声明注解
public @interface MyAnnotation{ } - 注解的本质就是一个interface。
注解属性类型
- 基本数据类型(四类八种)
- String类型
- 枚举类型(enmu)
- 注解类型
- Class类型
- 以上类型的一维数组类型
注解属性的使用
- 如果一个注解有属性,那么在使用注解时,要对属性进行赋值操作。
- 如果一个注解的属性有多个,都需要赋值。
- 可以给属性赋默认值(注解处用default)。
- 如果属性是数组类型:①可以直接使用 属性名={ };②数组值只有一个时可以省略“{}”。
- 对于属性名称value的操作:
元注解
用于修饰注解的注解,用于描述注解在什么范围及什么阶段使用。
四个元注解介绍:
- @Retention:指定注解信息在哪个阶段存在。
- SOURCE:编译阶段;
- CLASS:解析执行阶段;
- RUNTIME:在JVM中。
- @Target:标注注解的执行位置(ElementType.XXX)。
- @Document:生成注解信息到javadoc文档中。
- @InHerited:让注解有自动继承性。
- @Retention的值应该是RUNTIME,因为会结合反射技术来使用;@Target一般使用TYPE或METHOD。
反射介绍
反射,一种计算机处理方式,对于任一对象,都能动态获取信息以及动态调用对象方法功能。
反射的优缺点:
- 优点:
- 提高了程序的灵活性和扩展性;
- 降低耦合性,提高自适应能力;
- 允许程序创建和控制任何类的对象,无需提前硬编码目标类。
- 缺点:
- 性能问题:反射机制应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
- 反射会模糊程序内部逻辑,带来维护问题。
反射的API
- Class介绍及获取
java中的Class可以代表任意的类或者接口类型。
如何获取一个Class?- 如果有一个对象,可以直接通过从Object类中继承的getClass方法获取;
- 可以通过类包(接口)直接调用其属性.class获取;
- (推荐,无耦合)Class.forName()
为什么要获得Class?
反射操作中会获取类的成员,Constructor、Filed、Method,需要通过Class来获得其他对象。
- Constructor
单个构造器,得到它就可以实例化对象。- getConstructor获取类的public构造;
- getConstructors获取类的所有public构造;
- getDeclaredConstructor获取类的private构造;
- getDeclaredConstructors获取类的所有private构造。
- Filed
如何获取Filed?- getFiled获取类的public属性;
- getFileds获取类的所有public属性;
- getDeclaredFiled获取类的private属性;
- getDeclaredFileds获取类的所有private属性。
赋值、取值操作
- Method
如何获取一个Mehod对象?-
getMethod获取类的方法,包括父类的;
-
getMethods获取类的所有方法,包括父类的;
-
getDeclaredMethod获取仅本类的方法;
-
getDeclaredMethods获取仅本类的所有方法。
-
执行方法,invoke
-
Method的invoke使用注意事项
-
调用static方法
- 方法是静态的,invoke调用时不需要传递对象。
- 方法是静态的,invoke调用时不需要传递对象。
-
调用参数是数组类型的方法
-
反射赋值案例
代理
newProxyInstance描述
invocationHandler详解
- 是一个接口,接口中声明了一个invoke()(与反射不同)方法,它是在代理对象调用行为时会执行的方法,invoke方法有三个参数:
动态代理在开发中可以完成性能监控、权限控制、日志记录等操作。
创建对象的4种方式
- new关键字
- clone()方法
- 反序列化:objectInputStream.readObject()
- 反射:Class.newInstence()