【总结篇】Java注解总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sun8112133/article/details/89381325

版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址: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 在调用注解时才可以省略。




猜你喜欢

转载自blog.csdn.net/sun8112133/article/details/89381325