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();					// 获取方法注解属性值
        }					
    }
}
相关推荐
JoannaJuanCV30 分钟前
VLM学习-SFT(监督微调)
深度学习·学习·机器学习·大模型·视觉大模型·vlm·视觉编码器
钱栈up32 分钟前
VSCode 调试多模块 Maven + Spring Boot 后端:从启动失败到一次跑通
java·spring boot·maven
uoKent32 分钟前
c++中new和malloc的区别
java·jvm·c++
十五喵源码网43 分钟前
基于springboot2+vue2的疾病防控综合系统
java·毕业设计·springboot·论文笔记
砚底藏山河1 小时前
【量化纯GET实战 #11】移动均线 MA:5 日 20 日 60 日怎么算怎么用
java·python·金融·maven
一只小闪闪1 小时前
easy-trans java数据通用翻译框架v2.3.0
java·后端·架构
2601_962055811 小时前
Spring全部注解
java·后端·spring
chjif1 小时前
一张照片和一段声音如何生成口播视频:MiniMax H3 音画同步实测
java·前端·javascript
程序员大雄学编程1 小时前
微积分43. 无穷积分入门:从概念到Python实战可视化
开发语言·python·学习·微积分