注解

Jdk1.5之后的新特性

jdk默认的注解,可以用于doc文档的生成

删除package,执行javadoc xxx.java,就能生成文档

//package com.company;

import java.lang.reflect.Method;
import java.util.ArrayList;
public class Main {

    public static void main(String[] args) throws Exception {

    }

    /**
     * 计算俩
     * @parama整数
     * @paramb整数
     * @return 俩数字的和
     
     
    public int add(int a,int b){
        return a+b;
    }
}

作用分类

编写文档,通过代码表示的注解生成文档

代码分析:通过代码标识的注解对代码进行分析(反射)

编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查(@override)

jdk中预定义的一些注解

@override:检测被该注解标注的方法是否是继承父类的

@Deprecated:该注解标注的内容,已经过时(date当中的很多方法就是过时的方法)

@Suppresswarnings压制警告:可以用来压制ide的警告传参"all"可以压制所有的警告,卸载类上面可以压制整个类的所有警告

自定义注解

格式

public @interface MyAnno {}

编译成字节码之后

public interface MyAnno extends java.lang.annotation.Annotation{}

注解本质上就是一个接口,继承了Annotation

属性,接口中可以定义的成员方法

要求:只能返回以下类型

  • 基本数据类型
  • String
  • 枚举
  • 注解
  • 以上类型的数组

定义了属性,在使用时需要给属性赋值

1.如果定义属性时,使用default关键字给默认初始化,则使用注解时,可以不进行属性的赋值

2.如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可

3.数组赋值时,值使用大括号包裹,如果数组中就一个值,大括号可以省略不写

Main.java

package com.company;

public class Main {
    @MyAnno(value=12,anno2=@MyAnno2,strs={"123","!@3","awe"})
    public static void main(String[] args)  {
    
    }


}

MyAnno2.java

package com.company;

public @interface MyAnno2 {
}
package com.company;


public @interface MyAnno {
    int value();
    MyAnno2 anno2() ;
    String []strs();
}

元注解

用于描述注解的注解

@Target:描述注解能够作用的位置

参数:枚举类型的数组

TYPE:可以作用于类上

METHOD:可以作用于方法上

FIELD:可以作用于成员变量上

以上几个可以并存可以用逗号分隔开放在数组中

@Retention:描述注解被保留的阶段

参数,枚举类

SOURCE编译阶段 连字节码当中都不会存在

CLASS类对象阶段 会保留到字节码文件中,但不会被java虚拟机读取到

RUNTIME阶段 自己定义的一半使用这个注解:当前被描述的注解会保留到class字节码中并被jvm读取到

@Documeted:描述注解是否被抽取到api文档中

加了注解表示这个注解描述的信息可以被抽取到java doc文档

@Innherited:描述注解是否被子类继承

这个注解会自动的被子类继承,被该注解修饰的父类,其子类会自动继承他的注解

Main.java

package com.company;
@MyAnno(value=12,anno2=@MyAnno2,strs={"123","!@3","awe"})
public class Main {
//    @MyAnno(value=12,anno2=@MyAnno2,strs={"123","!@3","awe"}) 这样写会报错
    public static void main(String[] args)  {

    }


}

注解类

package com.company;
@MyAnno(value=12,anno2=@MyAnno2,strs={"123","!@3","awe"})
public class Main {
//    @MyAnno(value=12,anno2=@MyAnno2,strs={"123","!@3","awe"}) 这样写会报错
    public static void main(String[] args)  {

    }


}

在程序中使用解析注解

在程序中使用(解析)注解:获取注解中定义的属性值

Sxtable.java 作用在类上面的注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value = {ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Sxtable {
    String value();
}

Zhujie.java

作用在类属性上的注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value = {ElementType.FIELD})//作用在成员变量之上
@Retention(RetentionPolicy.RUNTIME)//保留到运行时阶段
public @interface Zhujie {
    String columName();
    String type();
    int length();
}

User.java 模型类

@Sxtable("tb_user")
public class User {
    @Zhujie(columName = "id",type="int",length = 11)
    private int id;
    @Zhujie(columName = "name",type = "int",length = 16)
    private String name;

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

Main

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) {
        System.out.println("------");
        try {
            Class clazz=Class.forName("User");
            Annotation[] annotations = clazz.getAnnotations();//获取这个类所有的注解
            for (Annotation a:annotations){
                System.out.println(a);//@Sxtable(value=tb_user)
            }
            Sxtable st = (Sxtable) clazz.getAnnotation(Sxtable.class);//获取指定的注解
            System.out.println(st);//@Sxtable(value=tb_user)

            //获得类属性的注解
            Field f=clazz.getDeclaredField("name");
            Zhujie zj = f.getAnnotation(Zhujie.class);
            System.out.println("name:"+zj.columName()+"\nlenth:"+zj.length()+"\ntype:"+zj.type());
            //name:name
            //lenth:16
            //type:int

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}
Last modification:April 21, 2022
如果觉得我的文章对你有用,请随意赞赏