JAVA注解是什么?

JAVA注解

注解是什么

注解(Annotation)是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。它是一种由JSR-175标准选择用来描述元数据的一种工具。

通俗的将就是一个辅助功能,可以传递数据,可以给编译器制定一个标准,要是你不按这个标准,就会编译错误。

常用注解(内置)

  • @Override

  • @Deprecated

  • @SuppressWarnings

  • @SafeVarargs

  • @FunctionalInterface

@Override

@Override 用在方法上,表示这个方法重写了父类的方法,如toString()。
如果父类没有这个方法,那么就无法编译通过,可以用来控制代码或检查正确性

@Deprecated

@Deprecated 表示这个方法已经过期,不建议开发者使用。(暗示在将来某个不确定的版本,就有可能会取消掉)

@SuppressWarnings

@SuppressWarnings Suppress英文的意思是抑制的意思,这个注解的用处是忽略警告信息。

1.deprecation:使用了不赞成使用的类或方法时的警告(使用@Deprecated使得编译器产生的警告);
2.unchecked:执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型; 关闭编译器警告;
3.fallthrough:当 Switch 程序块直接通往下一种情况而没有 Break 时的警告;
4.path:在类路径、源文件路径等中有不存在的路径时的警告;
5.serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告;
6.finally:任何 finally 子句不能正常完成时的警告;
7.rawtypes 泛型类型未指明
8.unused 引用定义了,但是没有被使用
9.all:关于以上所有情况的警告。

//例如在方法前面加上
@SuppressWarnings({ "rawtypes", "unused" })
//可以忽略不写泛型带来的警示
@SafeVarargs

@SafeVarargs 这是1.7 之后新加入的基本注解. 如例所示,当使用可变数量的参数的时候,而参数的类型又是泛型T的话,就会出现警告。 这个时候,就使用@SafeVarargs来去掉这个警告。

@SafeVarargs注解只能用在参数长度可变的方法或构造方法上,且方法必须声明为static或final,否则会出现编译错误。

@FunctionalInterface

@FunctionalInterface这是Java1.8 新增的注解,用于约定函数式接口。
函数式接口概念: 如果接口中只有一个抽象方法(可以包含多个默认方法或多个static方法),该接口称为函数式接口。函数式接口其存在的意义,主要是配合Lambda 表达式来使用。

//具体就是在只有一个抽象方法的前面使用(不包括static方法)
@FunctionalInterface
public interface Example {
    public void sayHello(String str);
}

使用该注解后就可以使用Lambda表达式来表示该接口的一个实现(java8特性,以前一般都用匿名函数)

Example e = str -> System.out.println("Hello " + str);
//箭头前面是参数,后面是方法实现,这样以后e就是一个实现了接口方法的类。
//若是有多个语句多个参数,请用{},()把它括起来。

自定义注解

先来看看@Override的注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
//其中@interface是用来定义一个注解的
//注解上面的@Target这些是元注解,就是注解的注解
元注解

@Documented – 注解是否将包含在JavaDoc中
@Retention – 什么时候使用该注解
@Target – 注解用于什么地方
@Inherited – 是否允许子类继承该注解
@Documented – 一个简单的Annotations标记注解,表示是否将注解信息添加在java文档中。
@Retention – 定义该注解的生命周期。

元注解可以设置参数,也可以不设置参数,像@Document就没有参数,作用是可以使用javadoc命令将注解生成相关文档

@Target

@Target表示这个注解能放在什么位置上,如@Target({METHOD,TYPE}),表示他可以用在方法和类型上(类和接口),但是不能放在属性等其他位置。 可以选择的位置列表如下:
ElementType.TYPE:能修饰类、接口或枚举类型
ElementType.FIELD:能修饰成员变量
ElementType.METHOD:能修饰方法
ElementType.PARAMETER:能修饰参数
ElementType.CONSTRUCTOR:能修饰构造器
ElementType.LOCAL_VARIABLE:能修饰局部变量
ElementType.ANNOTATION_TYPE:能修饰注解
ElementType.PACKAGE:能修饰包

@Retention

@Retention 表示生命周期,@Retention可选的值有3个:
RetentionPolicy.SOURCE: 注解只在源代码中存在,编译成class之后,就没了。@Override 就是这种注解。
RetentionPolicy.CLASS: 注解在java文件编程成.class文件后,依然存在,但是运行起来后就没了。@Retention的默认值,即当没有显式指定@Retention的时候,就会是这种class类型。
RetentionPolicy.RUNTIME: 注解在运行起来之后依然存在,程序可以通过反射获取这些信息,下面的例子就是这样。

@Inherited

@Inherited 表示该注解具有继承性,即父类的注解信息能否给子类使用。

@Documented

在用javadoc命令生成API文档后,DBUtil的文档里会出现该注解说明。

示例

@Repeatable(java1.8)

当没有@Repeatable修饰的时候,注解在同一个位置,只能出现一次,重复做两次就会报错了。
使用@Repeatable之后,就可以在同一个地方使用多次了。
@interface MyHints {
    Hint[] value();
}
 
@Repeatable(MyHints.class)
@interface Hint {
    String value();
}

//两个使用方法
@MyHints({@Hint("hint1"), @Hint("hint2")})

@Hint("hint1")
@Hint("hint2")

//解析时返回的是Hint[] 而不是MyHints
Filterable.class.getAnnotationsByType(Filter.class)
注解元素
//比如下面的JDBC连接注解,IP(),database()这些类似接口中函数声明的就是注解元素,用来存储数据。
@Target({METHOD,TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface JDBCConfig {
     String ip();
     int port() default 3306;
     String database();
     String encoding();
     String loginName();
     String password();
}
注解解析
JDBCConfig config = DBUtil.class.getAnnotation(JDBCConfig.class)//获得注解类
String ip = config.ip();										//获得注解元素
int port = config.port();
String database = config.database();
String encoding = config.encoding();
String loginName = config.loginName();
String password = config.password();

属性设置:

value:是一个特殊的属性,若在设置值时只有一个value属性需要设置或者其他属性都采用默认值时 ,那么value=可以省略,直接写所设置的值即可。
eg:@SuppressWarnings(“deprecation”)

为属性指定缺省值(默认值):
eg:String value() default “blue”; //定义在注解类中

数组类型的属性:
eg:int[] arrayArr() default {3,4,5,5};//定义在注解类中
SunAnnotation(arrayArr={3,9,8}) //设置数组值
Note:如果数组属性中只有一个元素时,属性值部分可以省略大括号。
eg:SunAnnotation(arrayArr=9)

注解类型的属性:

eg:MetaAnnotation annotationAttr() default @MetaAnnotation(“lhm”);

其中MetaAnnotation是注解类,注解也是类,是.java文件

TIPS

AnnotationDemo.class.isAnnotationPresent(SunAnnotation.class)
//用于描述某类中是否存在某类注解,放回true or false
    
SunAnnotation annotation = (SunAnnotation) AnnotationDemo.class.getAnnotation(SunAnnotation.class);
//返回一个注解类,若从方法获取注解用.class.getMethod("XXX").getAnnotation();

annotation.annotationClass()
//获取注解的类名称
    
//JAVA8新增
ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中。
ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。(声明语句、泛型和强制转换语句中的类型)

详细怎么使用可以参考这篇文章https://blog.csdn.net/sun_promise/article/details/51315032

发布了25 篇原创文章 · 获赞 7 · 访问量 2572

猜你喜欢

转载自blog.csdn.net/qq_44403367/article/details/105471514
今日推荐