0
点赞
收藏
分享

微信扫一扫

Java注解的学习笔记


文章目录

  • ​​一、概念​​
  • ​​二、分类​​
  • ​​三、JDK的注解​​
  • ​​3.1 JDK的注解可用来编写文档说明:​​
  • ​​3.2 JDK的注解可进行编译检查​​
  • ​​3.2 JDK中的元注解​​
  • ​​四、第三方的注解​​
  • ​​五、自定义注解​​
  • ​​六、注解案例​​
  • ​​七、总结​​

一、概念

  • 注解是一种代码级别的说明,是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;
}
}

Java注解的学习笔记_java

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 (注解的作用目标)
  • Java注解的学习笔记_自定义_02

  • @Retention (注解的生命周期)
  • Java注解的学习笔记_自定义_03

  • @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();
}

  • 自定义注解的属性的返回值类型必须满足以下类型:
  1. 基本数据类型
  2. String类型
  3. 枚举类型
  4. 注解类型
  5. 以上类型的数组
  • 属性赋值必须满足以下条件:
  1. 使用自定义注解时,没有默认值的属性必须给属性赋值;
  2. 如果属性使用了default关键字赋予了默认值,则注解在使用时可以不进行赋值。
  3. 数组赋值时,需要用大括号进行包裹。

/**
* 使用自定义注解,没有默认值的属性必须赋值
*/
@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());
}
}
}
}
}

Java注解的学习笔记_自定义_04

七、总结

  • 在项目开发过程中,我们一般会使用注解(比如使用Spring框架的注解),而不是自定义注解。
  • 注解一般是给编译器或解析程序(比如上述案例中的代码检测框架)用。
  • 注解不是程序的一部分,可以理解为注解就是一个标签。


举报

相关推荐

0 条评论