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 小时前
Vue3 + Java + Python 打造企业级大模型知识库(含 SSE 流式对话完整源码)
java·python·状态模式
Arthas2179 小时前
Java大厂面试:从Spring到微服务的全面技术考察
java·jvm·spring·微服务·面试·并发
mifengxing9 小时前
力扣HOT100——(1)两数之和
java·数据结构·算法·leetcode·hot100
向上的车轮9 小时前
熟悉C#如何转TypeScript——SDK与包引用
开发语言·typescript·c#
Z.风止9 小时前
Large Model-learning(2)
开发语言·笔记·python·leetcode
m0_738120729 小时前
我的创作纪念日0328
java·网络·windows·python·web安全·php
脆皮炸鸡7559 小时前
Linux开发工具~~~版本控制器Git以及调试工具GDB
linux·服务器·开发语言·经验分享·git·学习方法
用户8307196840829 小时前
Spring Boot 中Servlet、Filter、Listener 四种注册方式全解析
java·spring boot
xixingzhe29 小时前
spring boot druid 10秒超时问题
java·数据库·spring boot
無限進步D9 小时前
算竞常用STL cpp
开发语言·c++·算法·竞赛