Java注解的学习笔记
程序员文章站
2024-02-16 09:35:04
...
文章目录
一、概念
- 注解是一种代码级别的说明,是JDK1.5以后引入的一个特性。
- 它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明与注释。
- 注解以@开头,比如 @Autowired,@Service,@Controller,@Override ,@Test,@Value 等等
二、分类
- 注解按照来源划划分,可以分为
1、JDK的注解。
2、第三方的注解。
3、自定义注解。
三、JDK的注解
3.1 JDK的注解可用来编写文档说明:
- 通过代码里标识的注解可生成JavaDoc文档
/**
* 使用注解使得程序注释可生成JavaDoc
*
* @author zhuhuix
* @date 2020-09-06
* @version 1.0
*/
public class AnnotationDemo1 {
/**
* 两数之和
* @param a 加数1
* @param b 加数2
* @return 返回两数相加之各
*/
public int add(int a,int b){
return a+b;
}
}
3.2 JDK的注解可进行编译检查
- 通过代码里标识的注解让编译器能够实现基本的编译检查。
- @Override : 检测被该注解标注的主法是否是继承自父类或者接口的。
- @Deprecated:该注解标注的内容已过时。
- @SuppressWarnings :压制警告。
/**
* 使用注解让编译器进行编译检查
*
* @author zhuhuix
*/
public class AnnotationDemo2 {
// 继承自父类
@Override
public String toString() {
return super.toString();
}
// 过时
@Deprecated
public int add(int a,int b){
return a+b;
}
// 压制警告
@SuppressWarnings("all")
public int divide(int a,int b){
return a/b;
}
}
3.2 JDK中的元注解
-
@Target (注解的作用目标)
-
@Retention (注解的生命周期)
-
@Document (该注解标记的元素可以被Javadoc 或类似的工具文档化)
-
@Inherited (使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
四、第三方的注解
- 比如Spring框架中用到了大量的注解
注解 | 作用 |
---|---|
@SpringBootApplication | 让spring boot自动给程序进行必要的配置 |
@Controller | 用于定义控制器类 |
@RequestMapping | 提供路由信息 |
@Import | 用来导入其他配置类 |
@Autowired | 自动导入依赖的bean |
… | … |
五、自定义注解
- 首先我们需要了解注解的本质:其实就是一个接口,该接口默认继承Annotation接口
public interface MyAnnotation extends java.lang.annotation.Annotation{
}
public interface Annotation {
boolean equals(Object obj);
int hashCode();
String toString();
Class<? extends Annotation> annotationType();
}
- 自定义注解的格式:
/**
* 元注解
* 修饰符 @interface 注解名称 {
* 属性声明A
* 属性声明B
* 属性声明...
* }
*
* 修饰符:访问修饰符必须为public,不写默认为pubic;
* 关键字:必须为@interface;
*
* 属性:注解中内容,可以理解成自定义接口的实现部分;
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
/**
* 注解的属性声明的两种形式
* type elementName();
* type elementName() default value;
* type[] elementName();
*/
String value1() ;
String value2() default "test";
String[] value3();
}
- 自定义注解的属性的返回值类型必须满足以下类型:
- 基本数据类型
- String类型
- 枚举类型
- 注解类型
- 以上类型的数组
- 属性赋值必须满足以下条件:
- 使用自定义注解时,没有默认值的属性必须给属性赋值;
- 如果属性使用了default关键字赋予了默认值,则注解在使用时可以不进行赋值。
- 数组赋值时,需要用大括号进行包裹。
/**
* 使用自定义注解,没有默认值的属性必须赋值
*/
@MyAnnotation(value1 = "111",value3 = {"a","b"})
public class AnnotationDemo3 {
}
六、注解案例
- 自定义一个注解,用来标注代码检测
/**
* 自定义代码检测注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCheck {
}
- 编写一段源代码,用自定义注解进行标注
/**
* 源代码--使用自定义注解进行标注
*/
public class Source {
@MyCheck
public int method1(){
return 1+0;
}
@MyCheck
public int method2(){
return 1/0;
}
}
- 编写一个测试框架,进行异常检测
/**
* 使用自定义代码检查注解检查代码中是否存在BUG
*/
public class SourceCheck {
public static void main(String[] args) {
Source source = new Source();
Class clazz = source.getClass();
Method[] methods = clazz.getMethods();
for (Method method : methods){
if (method.isAnnotationPresent(MyCheck.class)){
try{
method.invoke(source);
} catch (Exception e) {
e.printStackTrace();
System.out.println(method.getName()+" 发生异常 :"+e.getCause().getMessage());
}
}
}
}
}
七、总结
- 在项目开发过程中,我们一般会使用注解(比如使用Spring框架的注解),而不是自定义注解。
- 注解一般是给编译器或解析程序(比如上述案例中的代码检测框架)用。
- 注解不是程序的一部分,可以理解为注解就是一个标签。
上一篇: Annotation详解