1、java 常见注解
@Override
@Deprecated 过时的方法
@SuppressWarnnings 抑制警告
2、常见的第三方注解
Spring
@Autowired
@Service
@Repository
Mybatis
@InsertProvider
@UpdateProvider
@Options
3、注解分类
3.1按来源
jdk
第三方
自定义
3.2 按运行机制
源码
编译时
运行时
4、自定义注解
注解定义
package com.winning.hispay.api.v1;
import java.lang.annotation.*;
/**
* @author
* @Description
* @Date 2022-01-22
**/
//作用域 type 类 、接口 field 字段声明
@Target({ElementType.TYPE,ElementType.METHOD})
//生命周期 source 只在源码显示,编译时会丢弃 class 编译时会记录到class中 运行时忽略 runtime 运行时存在 可通过反射读取
@Retention(RetentionPolicy.RUNTIME)
//允许注解继承 当查询一个类上的注解时 如果类上没有这个注解,则会自动查找父类一直找到object为止,如果找到了就会使用。接口上的注释无效。
@Inherited
//生成javadoc的时候会包含注解信息
@Documented
//使用@interface关键字定义注解
public @interface TEST {
//成员类型是受限的,合法的类型包括:基本数据类型、String、Class、Annotation、Enumeration。比如Map就会报错
//如果只有一个成员建议使用value(),因为在调用的时候 程序会获取value的值
//如果没有成员 注解就称为标识注解
///成员以《无参》《无异常》方式声明
String value();
//String desc();
//可以给默认值
//int age() default 18;
}
解析注解
package com.winning.hispay.api.v1;
import java.lang.reflect.Method;
/**
* @author
* @Description
* 解析注解 解析的只能是 @Retention(RetentionPolicy.RUNTIME) 运行时的,否则解析不到
* @Date 2022-01-23
**/
public class ParseAnno {
public static void main(String[] args) {
try {
//1、加载类
Class aClass = Class.forName("com.winning.hispay.api.v1.Brother");
//2、找到类上注解
boolean isExist =aClass.isAnnotationPresent(TEST.class);
if (isExist){
//3、获取注解实例
TEST t= (TEST) aClass.getAnnotation(TEST.class);
System.out.println(t.value());
}
//4、找到方法上的注解
Method[] ms=aClass.getMethods();
for (Method method:ms) {
boolean isMExist = method.isAnnotationPresent(TEST.class);
if(isMExist){
TEST t1 =method.getAnnotation(TEST.class);
System.out.println(t1.value());
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}