JAVA注解——Annotation--简单使用

一、注解定义

注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。

注解中的参数类型

注解中的参数只支持如下类型:

· 所有的基本类型:byte、short、char、int、long、float、double
· String类型
· Class类型
· enum类型
· Annotation类型
· 以上类型的数组

如果定义其他类型的参数编译器会报错。

二、元注解

1、什么是元注解

	元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。

如果难于理解的话,你可以这样理解。元注解也是一张标签,但是它是一张特殊的标签,它的作用和目的就是给其他普通的标签进行解释说明的。

2、四种元注解

@Target

表示该注解可以用在什么地方,可能的ElementType参数包括:
ElementType.ANNOTATION_TYPE 类、接口(包含注解类型)或enum声明
ElementType.CONSTRUCTOR 构造器的声明
ElementType.FIELD 域声明(包括enum实例),给属性声明
ElementType.LOCAL_VARIABLE 局部变量声明
ElementType.METHOD 方法声明
ElementType.PACKAGE 包声明
ElementType.PARAMETER 方法的参数声明
ElementType.TYPE 可以给一个类型进行声明,比如类、接口、枚举

@Inherited

允许子类继承父类中的注解
但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。

@Retention

表示需要在什么级别保存该注解信息。
- RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
- RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
- RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,因此可以通过反射机制读取注解的信息。

@Documented

用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.

大多数时候,程序员只要是定义自己的注解,并编写自己的处理器来处理他们。

三、JAVA内置的的注解,定义在java.lang中

@Override

表示当前的方法定义将覆盖超类中的方法。如果你不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示。	

@Deprecated

这个元素是用来标记过时的元素,想必大家在日常开发中经常碰到。编译器在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素比如过时的方法、过时的类、过时的成员变量。

@SuppressWarnings

阻止警告的意思。之前说过调用被 @Deprecated 注解的方法后,编译器会警告提醒,而有时候开发者会忽略这种警告,他们可以在调用的地方通过 @SuppressWarnings 达到目的。

四、注解的使用

定义一个自定义的注解

//自定义一个注解
import java.lang.annotation.*;
@Target({
    
    ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})//表示次注解可以被   类  方法使用
@Retention(RetentionPolicy.RUNTIME)  //表示注解在什么阶段下生效   runtime 运行时阶段/ class字节码阶段   /source 源码阶段
@Documented //表示可以在文档中显示
@Inherited  //表示此注解可以别继承
public @interface MyAnnotion {
    
    //@interfacce  定义注解的关键字
    String value();//定义一个字符串属性
    String [] info();//定义一个字符串数组
}

案例—用户输入判断

定义一个注解类

import java.lang.annotation.*;
@Target({
    
    ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Err {
    
    
    int  MinLength();//表示最短输入
    int  MaxLength();//表示最长输入
    String  keyword();//表示输入的是否含有关键字keyword
}

定义一个test类

package Annotion.homework;
public class test {
    
    
    @Err(MinLength = 3,MaxLength = 9,keyword = "ab")
    private String name;
}

定义一个demo01类

package Annotion.homework;

import org.junit.Test;
import java.lang.reflect.Field;
import java.util.Scanner;
public class Deom01 {
    
    
    public static void main(String[] args) throws NoSuchFieldException {
    
    
        //获取输入 scanner
        Scanner input=new Scanner(System.in);
        //输入一个数
        System.out.println("请输入一个值");
        String sc=input.next();
        //实例化test类对象  创建一个实例
        test test = new test();
        //获取对象的calss文件
        Class cla=test.class;
        //获取属性
        Field naemField= cla.getDeclaredField("name");
        //获取这个给值得属性对应得某个注解
        Err declaredAnnotation = naemField.getDeclaredAnnotation(Err.class);
        //获取这个注释里面配置参数值
        String keyword = declaredAnnotation.keyword();
        int max = declaredAnnotation.MaxLength();
        int min = declaredAnnotation.MinLength();
  //      System.out.println(min);
        if(sc.length()<=max&&sc.length()>=min){
    
    //输入得数>=min  <=max
           // System.out.println("cccc");
            if((sc.indexOf(keyword)!=-1)){
    
    //判断是否包含keyword   不包含则会返回-1
              //  System.out.println("aaa");
                if(sc.matches("^(?![A-Z]+$)(?![a-z]+$)(?!\\d+$)(?![\\W_]+$)\\S+$")){
    
    //判断是否包含2种以上的组合
                    System.out.println("输入成功!");
                    return;
                } } }
            System.out.println("输入失败!!");
    }}

猜你喜欢

转载自blog.csdn.net/haobo__/article/details/109700122