Java学习笔记十(注解)

注释:注解作用于(类,成员属性,方法,构造器,参数)

1 预定义注解

(1) @Deprecated // 标记对象为以过时

(2) @SupperessWarnings("all") // 忽略标记对象警告

(3) @Override // 检查目标重载

2 自定义注解

注释:自定义注解本质上是,实现(Annotation)接口的接口

(1) 定义注解: public @interface 注解名 { }

(2) 定义注解属性:类型 属性名();

java 复制代码
public @interface 注解名 {			
		byte typeA();		// 基本类型
		short typeB();		// 基本类型
		int typeC();		// 基本类型
		long typeD();		// 基本类型
		double TypeE();		// 基本类型
		float typeF();		// 基本类型
		boolean typeG();	// 基本类型
		char typeH();		// 基本类型
		String typeI();		// String
		TestEnum typeJ();	// 枚举
		AnnoF1 typeK();		// 注解
		int [] typeL();		// 数组
		String[] typeM();	// 数组
		TestEnum[] typeN();	// 数组
		AnnoF1[] typeO();	// 数组
}			

(3) 设置属性值:属性名=值;

java 复制代码
@注解名(	
	typeA=1,
	typeB=0,
	typeC=0,
	typeD=0,
	typeE=0,
	typeF=0,
	typeG=false,
	typH=0,
	typeI="",
	typeJ=TestEnum.A,
	typeK=@AnnoF1(""),
	typeL={0},
	typeM={""},
	typeN={TestEnum.B}
	typeO={@AnnoF1("")}
)	
...

(4) 属性默认值:default

注释:指定了默认值的属性,使用时可以不指定初期値

java 复制代码
public @interface 注解名 {	
	String value() default "xxx";
}	

(5) 默认属性:

注释:如果属性只有value,使用时可以不指定属性名

java 复制代码
public @interface AnnoF1 {	
	String value();
}

@AnnoF1("默认值")	
public void testMethod() {...}	

3 元注解

注释:元注解是用于描述注解的注解

(1) @Target // 描述注解生效位置

**ElementType.**TYPE(类或接口)

**ElementType.**FIELD(成员变量)

**ElementType.**METHOD(方法)

**ElementType.**CONSTRUCTOR(构造器)

**ElementType.**PARAMETER(参数)

**ElementType.**LOCAL_VARAIBLE(局部变量)

java 复制代码
@Target({ElementType.TYPE, ElementType.FIELD})			
public @interface 注解名 { }	

(2) @Retention // 描述注解生命周期

RetentionPolicy.SOURCE (注解存在于编码阶段,源码不存在)

RetentionPolicy.CLASS (注解存在于字节码阶段,运行不存在)

RetentionPolicy.RUNTIME (注解存在于所有阶段)

java 复制代码
@Retention(RetentionPolicy.RUNTIME)			
public @interface 注解名 { }			

(3) @Documented // 使类内的注解可被抽取到API文档

(4) @Inherited // 描述类内注解会被子类继承

4 解析注解案例

4.1 定义注解

// @Target(TYPE,METHOD) 表示注解可作用于 类 和 方法

// @Retention(RUNTIME) 表示在所有阶段都生效

java 复制代码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoF1 { String value(); }

4.2 使用注解

注释:为类注解设置"str1"值,为方法注解设置"str2"值

java 复制代码
@AnnoF1("str1")
public class Test {
    @AnnoF1("str2")
    public void fn1() {...}
    public void fn2() {...}
}

4.3 解析注解

(1) 获取实现类的字节码:Class<AnnoTest> c = AnnoTest.class;

(2) 获取注解1:AnnoF1 f1 = c.getAnnotation(AnnoF1.class); // 可获取包含父类继承来的注解标记(父类标记了(@Inherited))

(3) 获取注解2:AnnoF1 f2 = c.getDeclaredAnnotation(AnnoF1.class); // 获取本类注解

(4) 获取类全部注解1:Annotation\[\] fs = c.getAnnotations();

(5) 获取类全部注解2:Annotation\[\] fs = c.getDeclaredAnnotations();

java 复制代码
public void readAnno() {
    Class<Test> c = Test.class;  // 获取含注解的类对象
    AnnoF1 f1 = c.getAnnotation(AnnoF1.class);	// 获取类注解
    String val = f1.value();					// 获取类注解值
    Method[] ms = c.getDeclaredMethods();		// 获取类所有公开方法
    for (Method m : ms) {					    // 循环类所有公开方法
        if (m.isAnnotationPresent(AnnoF1.class)) {	    // 判断方法是否有AnnoF1注解
            AnnoF1 f2 = m.getAnnotation(AnnoF1.class);	// 获取方法注解
            String value2 = f2.value();					// 获取方法注解属性值
        }					
    }
}
相关推荐
敬往事一杯酒哈3 小时前
海康 AGV 导航读码器学习
学习
代码什么用4 小时前
Spring基础使用
java·后端·spring
Su米苏4 小时前
Spring AI 中MCP 与普通 @Tool的区别
java·人工智能·spring
码云数智-园园4 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
老板一杯拿铁4 小时前
Java 异常体系详解:从字节码原理到最佳实践
java
蜗牛互联网4 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端
qq_284274055 小时前
机械原理笔记:平面机构自由度计算(复合铰链、局部自由度、虚约束)与四杆机构入门(含考点)
笔记·学习·平面·自动化·制造
禾小西5 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨5 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言
小卡车5555 小时前
java反射、自定义注解的应用(自定义分页)
java