注解Annotation - Java

64 阅读1分钟

文章目录


理解注解,需要记得Java一切皆对象,底层都是一个个类写出来的

1. 注解分类

1.1. 元注解

Target:注解修饰的位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aRwzzGLk-1576144714345)(en-resource://database/12825:1)]

Retention:注解对象的存活时间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ChwbPVY-1576144714352)(en-resource://database/12827:1)]

1.2 JDK内置常用注解

1.3 自定义注解

注意要获取注解对象的参数值,必须你自定义的注解Retention生命周期是运行期 — 因为注解是利用反射获取二进制的属性值

  自定义注解 – 切记别手动继承Annotation

// 注解可修饰方法、类
@Target({ElementType.METHOD, ElementType.TYPE})
@interface MyAnno {
     public String name();
     public String[] hobby();     
}


使用自定义注解

@Anno(name = "lrc", hobby = { "蓝旗", "足球" })
public class Test8 {
	
	@Anno(name = "ytr", hobby = { "桌球", "男人" })
	public void a() {}
	
	public static void main(String[] args) {
		
		
		Class<Test8> clazz = Test8.class;
		
		// 获取修饰Test8类的注解对象
		Anno annos1 = (Anno)clazz.getDeclaredAnnotation(Anno.class);
		
		System.out.printf("name:%s, hobby:%s", annos1.name(), Arrays.toString(annos1.hobby()));
			
		
		System.out.println("\n\n=====================\n");
		
		
		// 获取修饰Test8内的成员函数a的注解对象 
		try {
			Method methodA = clazz.getMethod("a");
			Anno annos2 = (Anno)methodA.getDeclaredAnnotation(Anno.class);
			System.out.printf("name:%s, hobby:%s", annos2.name(), Arrays.toString(annos2.hobby()));
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
	}
}


运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wZNyFKoU-1576144714365)(en-resource://database/12843:0)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G4Xixj7Z-1576144714370)(en-resource://database/12841:1)]

2. 注解源码分析

2.1 Annotation - 注解接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0qeb61zm-1576144714375)(en-resource://database/12837:0)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOznf1hN-1576144714377)(en-resource://database/12839:0)]

2.2 AnnotationInvocationHandler - 注解真正起作用的对象 - 代理对象、并利用反射

为什么利用反射实现注解?正因为能自定义注解,所以才用反射。当我们自定义注解是写了很多方法接口的,如果没有反射,JVM根本识别不了你写的方法接口。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CdTQD8nA-1576144714381)(en-resource://database/12835:0)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tbiVhcE1-1576144714384)(en-resource://database/12833:0)]