欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【总结篇】Java注解总结

程序员文章站 2024-01-31 08:22:52
...

版权声明:本文为 小异常 原创文章,非商用*转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/89381325








注解 在 Java5 提出的一个特性,写法简单。注解是 Java 中的 metadate(元数据),其实就是代码里的 “特殊标记”,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用注解,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。

注解 可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。

使用 注解 时要在前面加 @ 符号,并把该注解当成一个修饰符使用。



一、JDK内置的基本注解类型(3个)

1、@Override

限定重写父类方法,该注解只能用于方法。

2、@Deprecated

用于表示已过时。

3、@SuppressWarnings("all")

抑制编译器警告。



二、元注解(对注解进行注解)(4个)

元注解 是用于修饰其他的注解定义,专门在注解上的注解类型。

元注解: @Retention 、@Target、@Documented、@Inherited

1、@Retention

表示需要在什么级别保存该注解信息,用于描述注解的生命周期。

  • RetentionPolicy.SOURCE: 只在源文件中有效,编译器和运行时不会保留。
  • RetentionPolicy.CLASS: 只有在源文件和字节码文件中有效,运行时不会保留。
  • RetentionPolicy.RUNTIME: 在源文件、字节码文件和运行时有效,程序可以通过反射获取该注解。

2、@Target

注解的描述范围(也就是此注解在什么地方用)。

  • ElementType.TYPE: 类型(类、接口或枚举声明)
  • ElementType.FIELD: 属性
  • ElementType.METHOD: 方法
  • ElementType.PARAMETER: 参数
  • ElementType.CONSTRUCTOR: 构造器
  • ElementType.LOCAL_VARIABLE: 局部变量

使用位置:

@类型注解
public class MyClass {
	@属性注解
	private int age;
	@构造器注解
	public MyClass() {
		
	}
	@方法注解
	public void eat(@参数注解 String str) {
		@局部变量注解
		int a = 10;
	}
}

3、@Documented

被此注解修饰的类,会被 javadoc 工具提取成文档。

4、@Inherited

被它修饰的注解将具有继承性。如果某个类使用了被此注解修饰的注解,则其子类将自动具有该注解(实际开发中,使用较少)。



三、重复注解(Java8新增)

重复注解 就是可以重复使用同一个注解。(在 Java8 之前有一个限制,同一个地方的不能使用同一个注释超过一次)

1、例如

@MyAnno("hello")
@MyAnno("world")
public void show() {

}

2、使用方式

1)先自定义一个注解

2)再自定义一个注解容器

3)在自定义注解上声明@Repeatable,并指明该注解的容器


小栗子:
// 自定义注解
@Repeatable(MyAnnos.class)
@Target({METHOD})
public @interface MyAnno {
	String value();
}

// 自定义注解容器
@Target({METHOD})
public @interface MyAnnos {
	MyAnno[] value();
}

3、应用

// 通过反射获取该方法上的所有注解
@Test
public void test1() throws Exception {
	Class<TestAnnotation> clazz = TestAnnotation.class;
	Method m1 = clazz.getMethod("show");
	// 获取MyAnno类型的重复注解
	MyAnno[] mas = m1.getAnnotationsByType(MyAnno.class);
	// 遍历重复注解 
	for (MyAnno ma : mas) {
		System.out.println(ma.value());
	}
}


四、自定义注解

// 次注解可以在类型及方法上使用,并可以通过反射获取该注解
@Target(value = {ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ClassAnno {
	String value() default " ";    // String是参数类型,value是参数名,default是默认值
}

注:如果只有一个参数,一般定义为 value,只有 value 在调用注解时才可以省略。