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();					// 获取方法注解属性值
        }					
    }
}
相关推荐
SL_staff18 分钟前
从RBAC到场景化授权:《无忧·企业文档》三级权限模型的技术实践解析
java·开源·产品
传奇开心果编程1 小时前
【springboot基础语法学与练】第 1 课:从零开始
java·spring boot·后端·学习
SL_staff1 小时前
财务系统慎用低代码?从数据模型闭环看合规落地的技术实践
java·低代码·全栈
滕州市燕猫虎计算机科技工作室个体工商户1 小时前
IDEA:Command line is too long
java·ide·intellij-idea
扶风ff1 小时前
练题簿小程序:家庭在线练题,课后复习更简单
学习·小程序
传奇开心果编程1 小时前
【Flutter入门练中学】第2课:布局系统
学习·flutter·ui
彧azz2 小时前
Linux 网络编程学习总结
linux·网络·笔记·学习·面试
步行cgn2 小时前
Spring p 命名空间注入详解
java·前端·spring
YatHinLay2 小时前
MyBatis 流式查询实战:ResultHandler 处理海量数据
java
天天被压力2 小时前
【跨市场数据实战 #08】可转债折价机会怎么筛:3个接口抓比价、列表和实时盘口
java·人工智能·python