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

相关推荐
aq553560010 分钟前
PHP vs Python:30秒看懂核心区别
开发语言·python·php
我是无敌小恐龙12 分钟前
Java SE 零基础入门Day01 超详细笔记(开发前言+环境搭建+基础语法)
java·开发语言·人工智能·opencv·spring·机器学习
破浪前行·吴18 分钟前
数据结构概述
数据结构·学习
码云数智-大飞1 小时前
零基础微信小程序制作平台哪个好
开发语言
心态与习惯1 小时前
Julia 初探,及与 C++,Java,Python 的比较
java·c++·python·julia·比较
神仙别闹1 小时前
基于 MATLAB 实现的 DCT 域的信息隐藏
开发语言·matlab
一叶飘零_sweeeet1 小时前
优秀文章合集
java
techdashen1 小时前
Go 标准库 JSON 包迎来重大升级:encoding/json/v2 实验版来了
开发语言·golang·json
zopple1 小时前
ThinkPHP5.x与3.x核心差异解析
java·python·php
.千余2 小时前
【Linux】基本指令3
linux·服务器·开发语言·学习