今天我针对Java中的注解机制以及动态代理机制进行的学习,学习内容如下:
1.注解(Annotation)的应用场景:
(1)生成JavaDoc文档:
例如在类的源代码中要注明版本,作者...,在方法部分要注明方法的参数有什么意义,以及方法的返回值有什么意义;
(2)在编译时进行格式检查,典型的如:@Override、@FunctionalInterface...
(3)跟踪代码依赖性,实现替代配置文件的功能,利用反射机制可以获取Annotation数组以便进行进一步处理;
2.注解分类:
(1)内置注解:
常见实例:
@Override:表示当前方法定义会覆盖掉父类中的方法,如果拼写错误或者签名错误会提示出错,Retention级别是RetentionPolicy.SOURCE;
@Deprecated:作用是对不应该再使用的类、类成员、方法添加注解,表明已经废弃或已经过时,不应再使用。和JavaDoc中的@deprecated有着相同的作用;
@SuppressWarnings:压制、关闭对指定部分的异常警告;
SuppressWarnings支持的参数如下,可以传入多个参数;

@FunctionalInterface:用来表明该接口是函数时接口,只能有一个方法;
(2)元注解:用来规范注解类的注解
常见示例:
@Target:用于修饰注解的使用范围,通过枚举类ElementType来修饰范围:
java
public enum ElementType {
/** 标明该注解可以用于类、接口(包括注解类型)或enum声明 */
TYPE,
/** 标明该注解可以用于字段(属性)声明,包括enum实例 */
FIELD,
/** 标明该注解可以用于方法声明 */
METHOD,
/** 标明该注解可以用于参数声明 */
PARAMETER,
/** 标明注解可以用于构造方法声明 */
CONSTRUCTOR,
/** 标明注解可以用于局部变量声明 */
LOCAL_VARIABLE,
/** 标明注解可以用于另一个注解上声明 */
ANNOTATION_TYPE,
/** 标明注解可以用于包声明 */
PACKAGE,
/**
* 标明注解可以用于类型参数声明
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
* 类型使用声明
*
* @since 1.8
*/
TYPE_USE,
/**
* 模块声明.
*
* @since 9
*/
MODULE
}
@Retention:用于规范注解的声明周期,通过枚举类RetentionPolicy来规范
java
public enum RetentionPolicy {
/**
* 注解的信息只会记录在源文件中,编译时会被编译器丢弃,不会保存在编译好的类信息中
*/
SOURCE,
/**
* 编译器将注解记录在类文件中,但不会加载到虚拟机中,如果一个注解声明没有指定范围,则
系统默认值就是CLASS
*/
CLASS,
/**
* 注解信息会保留在源文件、类文件中,在执行时也加载到虚拟机中,可以通过反射机制进行读
取
*/
RUNTIME
}
@Documented:用来做标识,在生成JavaDoc的时候会显示该标识;
@Inherited:用来表示某个注解可以被继承,如果该注解定义在类上则可以被继承,如果定义在放法上,子类直接继承父类的方法是可以继承过来的,但是对于重写的方法则不能继承,会做覆盖处理;
(3)自定义注解:
格式:public @interface 注解名{},注意:注解类不能继承或实现其他父类或接口;
其中的每一个成员方法就是一个配置参数。方法名称就是参数的名称,方法的返回值类型就是参数的类型,并且定义时可以使用default来就行初始化赋值,方法不能有参数;
当该注解类只有一个参数的时候,一般方法名叫value,这时value可以不显示的写出来;
3.基于JDK的动态代理:
动态代理的实现分为两种:一种是基于JDK实现的动态代理,另一种是CDLIB动态代理;
基于JDK的动态代理本质上是基于接口的动态代理,所以目标类必须实现接口;
实现该机制的步骤如下:
(1)创建接口,定义想要实现的功能;
(2)创建目标类实现接口,编写对应方法;
(3)创建InvocationHandler的实现类,并重写invoke方法,invoke方法中的proxy表示JDK创建的代理对象,method表示目标类的方法,args表示目标类方法的对应参数,在其中调用增强功能的方法和method.invoke即目标类的方法;
java
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {}
(4)使用Proxy的newProxyInstance,创建代理对象,并把返回值转为接口类型;
(5)调用相应的方法;
到此为止,我JavaSE相应的知识学的差不多了,我想接下来提升一下我的算法水平和做一些项目提升业务能力,欢迎大家莅临指导我,谢谢大家了