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

相关推荐
骇客野人8 分钟前
IntelliJ IDEA 使用技巧
java·ide·intellij-idea
大尚来也14 分钟前
用 Python 自动整理文件、重命名、分类电脑文件夹
开发语言·python
CVer儿15 分钟前
c++二级指针
开发语言·c++
xiaoyuchidayuma16 分钟前
【交流绕组及其磁动势-典型交流绕组结构(绘制绕组展开图)】
笔记·学习
Jul1en_35 分钟前
【Java 脚手架】封装通用工具类-1
java·spring boot·分布式·spring·spring cloud
mlidongfeng1 小时前
[AI][C++26] SIMD 编程模型思考
开发语言·c++·人工智能
j7~1 小时前
【Linux】二十七.线程篇四《Linux多线程编程:线程互斥(互斥量的底层到封装)、线程安全和冲入、死锁》---详解
linux·开发语言·c++·线程安全·死锁·线程互斥·重入
关于不上作者榜就原神启动那件事1 小时前
从 MDC 到 Agent:我手搓的文档路由协议,在 Spring AI Alibaba 里找到了正式实现
java·人工智能·spring·ai·agent
刘名喜1 小时前
第09篇-协程基础-Kotlin异步编程
开发语言·kotlin·springboot
其实防守也摸鱼1 小时前
HackBar 工具完全指南:信息探测、漏洞验证与安全测试实战
开发语言·人工智能·学习·安全·网络安全·安全威胁分析·安全性测试