Java学习日记——DAY25(JavaSE完结)

今天我针对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相应的知识学的差不多了,我想接下来提升一下我的算法水平和做一些项目提升业务能力,欢迎大家莅临指导我,谢谢大家了

相关推荐
运维行者_几秒前
广域网性能监控:分布式IT架构下的链路质量保障
开发语言·网络·分布式·后端·架构·数据库架构
梅雅达编程笔记1 分钟前
零基础学 Python 第7章 | 字典 dict:键值对存储
开发语言·python·beautifulsoup·numpy·pandas
灯澜忆梦6 分钟前
GO---map函数
开发语言·前端·后端·golang
一楼的猫6 分钟前
网文AI辅助怎么过审?番茄200+维度检测与去AI味实战
人工智能·学习·机器学习·自然语言处理·ai写作
喜欢打篮球的普通人21 分钟前
LLVM后端指令选择
android·java·javascript
某不知名網友28 分钟前
C++ 七大排序算法完整讲解
java·算法·排序算法
CodeStats36 分钟前
《源纹天书》第一百六十一章至第一百六十五章:开源化宣言、元定义的力量、栈帧重构、容器道场升级、技术债的化身!
java·源纹天书
不良手残41 分钟前
MyBatisPlus代码自动生成器
java
SamDeepThinking44 分钟前
一次线程池线上故障复盘:四层防线如何避免数据丢失
java·后端·程序员
渣渣灰飞1 小时前
MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第一章:企业数据库设计规范
数据库·学习·mysql