文章目录
- 前言
- 一、Java注解分类
- 二、注解中是否有成员变量的区别
- 总结
前言
Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能
一、Java注解分类
1.jdk基本注解
1.1 @Override //重写
1.2 @Deprecated //已过时
1.3 @SuppressWarnings(value = "unchecked") //压制编辑器警告
2.jdk元注解
元注解:用于修饰其他的注解(纪委:管干部的干部)
2.1 @Retention:定义注解的保存策略
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含。
@Retention(RetentionPolicy.CLASS) //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得。
@Retention(RetentionPolicy.RUNTIME) //注解会在class字节码文件中存在,在运行时可以通过反射获取到。
2.2 @Target:指定被修饰的Annotation可以放置的位置(被修饰的目标)
@Target(ElementType.TYPE) //接口、类
@Target(ElementType.FIELD) //属性
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE) //局部变量
@Target(ElementType.ANNOTATION_TYPE) //注解
@Target(ElementType.PACKAGE) //包
注:可以指定多个位置,例如
@Target({ElementType.METHOD, ElementType.TYPE}),也就是次注解可以在方法和类上使用
2.3 @Inherited:指定被修饰的Annotation将具有继承性
2.4 @Documented:指定被修饰的该Annotation可以被javadoc工具提取成文档
3.自定义注解
使用@interface关键字, 其定义过程与定义接口非常类似, 需要注意的是:
Annotation的成员变量在Annotation定义中是以无参的方法形式来声明的, 其方法名和返回值类型定义了该成员变量的名字和类型,
而且我们还可以使用default关键字为这个成员变量设定默认值,例如:
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Tag {
String name() default "该叫啥才好呢?";
String description() default "这家伙很懒, 啥也没留下...";
}
注:只有名字为“value”属性,赋值时可以省略属性名,例如:Springmvc的@RequestMapping
-
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface RequestMapping { String name() default ""; String[] value() default {}; String[] path() default {}; RequestMethod[] method() default {}; String[] params() default {}; String[] headers() default {}; String[] consumes() default {}; String[] produces() default {}; }
可以写成@RequestMapping("/test")
二、注解中是否有成员变量的区别
1.标记Annotation:
没有成员变量的Annotation; 这种Annotation仅利用自身的存在与否来提供信息
2.元数据Annotation:
包含成员变量的Annotation; 它们可以接受(和提供)更多的元数据;
总结
如有纰漏,请指正,互相进步。