文章目录
- 一、注解定义
- 注解中的参数类型
- 二、元注解
- 1、什么是元注解
- 2、四种元注解
- @Target
- @Inherited
- @Retention
- @Documented
- 三、JAVA内置的的注解,定义在java.lang中
- @Override
- @Deprecated
- @SuppressWarnings
- 四、注解的使用
- 定义一个自定义的注解
- 案例---用户输入判断
一、注解定义
注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。
注解中的参数类型
注解中的参数只支持如下类型:
· 所有的基本类型: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("输入失败!!");
}}