Java注解--反射 你值得拥有

Java奇思妙想的注解

希望本文可以帮助到你



前言

主要内容


提示:以下是本篇文章正文内容,下面案例可供参考

一、注解的理解

1.JDK5.0 新增的功能
2.**Annotation(注解)**其实就是代码里的特殊标记,这些标 记可以在编译,类加载,运行时读取,并执行相应的处理。
3.作用:配置应用程序的一些配置时,减少遗留的冗余,繁琐代码和XML配置

框架 = 注解 + 反射机制 + 设计模式

二、注解的使用

1.示例

1.1 生成文档相关的注解

@author 表名该类模块的作者 多个作者,隔开
@version 表明该类板块的版本
@see 将后面的参数在javaDoc转为链接,进行跳转
@since 从哪个版本新增的
@param 对方法中某参数的说明 如果无参可以不写
@return 对方法返回值的说明 如果方法返回类型void可不写
@exception 对方法可能抛出的异常进行说明 如果方法没有throws显示抛出的异常就不能写其中

注意:
1.@see 后面跟包名.类名#方法名/成员属性
2.@param {变量类型} 变量名 变量说明
在这里插入图片描述

1.2在编译时进行格式检查(JDK内置基本注解) 了解即可

@Override:对于重写的方法进行的标识
在这里插入图片描述

@Deprecated:用于表示所修饰的元素(类、方法等)已过时,通常是因为所修饰的结构存在危险或存在更好的选择。
在这里插入图片描述

SuppressWarning:抑制编译器警告
在这里插入图片描述

1.3 跟踪代码依赖性,实现替代配置文件功能

在这里插入图片描述

2.自定义注解

定义新的Annotation类型使用**@interface关键字**
自定义注解自动继承了java.lang.annotation.Annotaion接口
成员变量以无参方法形式来定义
类型可以是八大基本数据类型以及引用数据类型+Annotation类型/enum类型等
如果只有一个参数成员,建议使用参数名value 使用时候也可以省略"value="
没有成员的注解称为标记,包含成员变量的注解称为元数据Annotation

在这里插入图片描述

三、元注解

1. 基本解释

元注解:对现有注解的解释说明

2. JDK提供的四种基本元注解

重点在于Retetion和Target
Retention:对于现有修饰的注解指定其声明周期

  • RetentionPolicy.SOURCE:只在源文件保留,编译时会自动丢弃
  • RetentionPolicy.CLASS(默认):在class文件保留,在运行时,JVM不会保留
  • RetentionPolicy.RUNTIME:在运行时有效,当运行时JVM会保留注释,程序可以通过反射获取该注释
    Target:表明所修饰的注解可以用在什么类型的结构上
    在这里插入图片描述
    Documented:用于指定修饰的注解的Annotation类被javadoc工具提取成文档,默认情况,javadoc是不包含注解的

注意:定义为Documented的注解必须设置Retention值为RUNTIME。不会该注解无法保留到运行时
@Inherited:被其修饰的注解具有继承性。吐过某个类使用了该修饰,则子类具有该注解

3.利用反射获取注解信息

在这里插入图片描述

四、JDK8中注解的新特性

4.1 可重复注解 重点

JDK8以前示例

//Test.java
@MyAnnotations({
@MyAnnotation(value = "hh")
,@MyAnnotation(value="1h")
})
public class My {
}

//MyAnnotations注解文件
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface MyAnnotations {

    MyAnnotation[] value();
}

// MyAnnotation注解文件
@Inherited
@Repeatable(MyAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface MyAnnotation {

    String value() default "hello";
}

JDK8示例

//在MyAnnotation注解文件上添加:@Repeatable(MyAnnotations.class) 可以重复注解

//Test.java 如下
@MyAnnotation(value = "hh")
@MyAnnotation(value="1h")
public class My {
}

4.2 类型注解 重点

使用了@Target注解下参数类型ElementType

TYPE_PARAMETER:表名该注解可以写在任何类型变量的声明语句中
TYPE_USE:表名该注解能写在任何类型的任何语句中

//MyAnnotation2
@Target({ElementType.TYPE_PARAMETER})
public @interface MyAnnotation2 {
    String value();
}

// test1.java
public class Test1<@MyAnnotation2() T> {}

//MyAnnotation3
@Target({ElementType.TYPE_USE})
public @interface MyAnnotation2 {
    String value();
}

//test2.java
// test1.java
public class Test1 {
    @MyAnnotation
    private String name;
    AnnotationTest<@MyAnnotation String> t = null;
    int a = (@MyAnnotation int) 2L    
}

总结

对于本文当中所描述的JDK自带的基本注解以及元注解了解即可,其余的作为补充,会用即可

posted @ 2022-11-03 00:29  LiveH  阅读(27)  评论(0)    收藏  举报