前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 注解

Java 注解

原创
作者头像
沪上队长
修改2018-05-03 17:44:43
2.7K4
修改2018-05-03 17:44:43
举报
文章被收录于专栏:物联网事物联网事

常见的注解

以下注解都是 Annotation 接口的实现

标注

说明

@Deprecated

所标注内容,不再被建议使用。

@Override

只能标注方法,表示该方法覆盖父类中的方法。可以检查方法是否写错

@Documented

所标注内容,可以出现在javadoc中。

@Inherited

只能被用来标注“Annotation类型”,它所标注的Annotation具有继承性。

@Retention

只能被用来标注“Annotation类型”,用来指定Annotation的RetentionPolicy属性。

@Target

只能被用来标注“Annotation类型”,用来指定Annotation的ElementType属性。

@SuppressWarnings

@SuppressWarnings 所标注内容产生的警告,编译器会对这些警告忽略。

什么是注解

  • 本质:注解名称对应一个注解类
  • 语法:@注解名称(属性:属性值)
  • 作用:校验、替代一些配置文件信息
  • 解析:注解是由相关的框架来解析的,我们只使用即可

定义注解类

  • 所有的注解都是Annotation 接口的实现类或之类
  • java.lang.annotation # Annotation
  • 语法:@interface 注解名
代码语言:txt
复制
@interface MyAnno1 {

}

注解可以作用的目标

  • 类、接口、枚举
  • 构造方法
  • 成员变量
  • 局部变量
  • 方法
  • 形参
代码语言:txt
复制
// 作用在包上,先不讲
package com.rlk.anotation;

@MyAnno1 //作用在类上
public class Demo1 {
	@MyAnno1 //作用在:成员变量
	private String name;
	
	@MyAnno1 //作用在:构造方法
	public Demo1() {
	}
	
	@MyAnno1 //作用在:方法
	public void fun1() {
	}
	
	public void fun2(@MyAnno1 String name) { //作用在:形参
		
		@MyAnno1 // //作用在:局部变量上
		String username = "hello";

		// 错误:不能作用在方法或者属性的调用上
		Demo1 demo1 = new Demo1();
		
		@MyAnno1  // 错误
		demo1.属性;
		
		@MyAnno1  // 错误
		demo1.方法
	}
}

注解的属性

在使用注解的时候,可以给你指定属性值。

要指定什么样的值,以及如何如指定,必须看这个属性在定义注解的时候怎么去定义的。

  • 语法: 属性类型 属性名()
代码语言:txt
复制
@interface MyAnno1 {
    int age();   //age属性
    String name();  //name属性
}
  • 注解属性的类型:
    • 8中基本类型
    • String
    • Emum
    • Class
    • 注解类型
    • 以上类型的一维数组类型
代码语言:txt
复制
@interface MyAnno1 {
    int a();
    String b();
    MyEnum1 c();
    Class d();
    MyAnno2 e();
    int[] f();
}

定义并使用注解的属性

  • 在使用注解的时候,对其定义的属性进行赋值@MyAnno1(age=100, name="zhangSan") //给注解的属性进行赋值 public class Demo1 { ... }
  • 定义属性的默认值
    • 在定义属性的时候,可以对其设置默认值。在使用注解的时候,可以不给该属性指定值,也可以重新指定,覆盖默认值。
代码语言:txt
复制
@interface MyAnno2 {
    int age() default 100;  // 注解属性的默认值
    String name();
}
代码语言:txt
复制
@MyAnno2(name="liSi")  // 使用注解、属性
public class Demo2 {
    ...
}
  • values 属性特权@interface MyAnno3 { int value(); }
  • 当属性名称为 value 的时候,在使用的时候赋值,直接写值即可。
代码语言:txt
复制
@MyAnno3(100)
public class Demo2 {

}

注解的作用目标权限 @Target

  • 含义:对注解的使用的目标进行了限制,只能在 某个或某些 作用目标上@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}) @interface MyAnno1 { ... }
  • 表示:@Target
  • 对应关系:Annotaion : ElementType = 1 : n
  • 在定义注解的时候,给定义的注解添加注解,即 @Target,用来表明该注解可以用在一个过几个地方,有所限制
  • 例如,下面的注解 @MyAnno1 注解由 @Target 指定,只能作用在类、方法、属性上

java.lang.Override.java

代码语言:txt
复制
// 这个@Target添加在Override的注解定义上,那么Target的属性值是什么呢,去定义的地方看看
@Target(ElementType.METHOD)  
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

java.lang.annotation.Target.java

代码语言:txt
复制
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();  // Target注解的属性类型:为枚举类型数组
}

java.lang.annotation.ElementType

代码语言:txt
复制
public enum ElementType {
    TYPE,  /** Class, interface (including annotation type), or enum declaration */
    FIELD,  /** Field declaration (includes enum constants) */
    METHOD,  /** Method declaration */
    PARAMETER,  /** Formal parameter declaration */
    CONSTRUCTOR,  /** Constructor declaration */
    LOCAL_VARIABLE,  /** Local variable declaration */	
    ANNOTATION_TYPE,  /** Annotation type declaration */	
    PACKAGE,  /** Package declaration */
    TYPE_PARAMETER,  /** Type parameter declaration */
    TYPE_USE  /** Use of a type */
}

注解的保留策略限定 @Retention

  • 含义:注解在源码、字节码、JVM中,是否可以保留@Retention(RetentionPolicy.RUNTIME) @interface MyAnno1 { ... }

java.lang.annotation.Retention.java

代码语言:txt
复制
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION\_TYPE)
public @interface Retention {  // 定义@Retention注解
    RetentionPolicy value(); // 属性 enum RetentionPolicy 类型
}
  • 表示:@Retention ,保留
  • 对应关系:Annotaion : RetentionPolicy = 1 : 1
  • 分类:(指定哪种类型,即在哪种情况下及其之前的动作才存在注解)
    • 源代码文件(SOURCE):注解只在源代码中存在,当编译时就被忽略了
    • 字节码文件(CLASS)默认:注解在源代码中存在,然后编译时会把注解信息放到了class文件,但JVM在加载类时,会忽略注解!
    • JVM中(RUNTIME):注解在源代码、字节码文件中存在,并且在JVM加载类时,会把注解加载到JVM内存中(它是唯一可反射注解! 关键关键关键!!!)
  • 例如: 该注解在源码、字节码、JVM中都存在

java.lang.annotation.RetentionPolicy.java

代码语言:txt
复制
public enum RetentionPolicy {
    SOURCE,
    CLASS,
    RUNTIME
}

总结

  • 因此在好多注解定义的时候,都会给注解加上以上两个注解,至关重要@Target(ElementType.METHOD) // 注解的作用目标权限 @Retention(RetentionPolicy.SOURCE) // 注解的保留策略限定
  • 关于注解的反射另外介绍

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常见的注解
  • 什么是注解
  • 定义注解类
  • 注解可以作用的目标
  • 注解的属性
  • 定义并使用注解的属性
  • 注解的作用目标权限 @Target
  • 注解的保留策略限定 @Retention
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档