java语言基础--枚举,注解,正则和反射

注解

@Retention(RetentionPolicy.RUNTIME)//注解保留策略
public @interface MyAnno {
    String str();
    int val();
}
    @MyAnno(str = "测试注解",val = 100)
    public void test() {

    }

  所有注解都只包含方法声明,不能提供方法体。应用注解时,需要为注解成员提供值

注解的保留策略,java指定三种保留策略,它们被封装到java.lang.annotation.RetentionPolicy枚举中,

SOURCE ,只在源文件保留,编译器会被抛弃

CLASS 在编译时存储到.class文件中,运行时不可通过jvm得到这些注解

RUNTIME  在编译时存储到.class文件中,运行时可通过jvm得到这些注解

  因此,RUNTIME  是最永久的注解

使用反射在运行时获取注解

@Retention(RetentionPolicy.RUNTIME)//注解保留策略
public @interface MyAnno {
    String str() default "OK";
    int val() default 500;
}
public class Test {

    @MyAnno(str = "测试注解",val = 100) //这里不指定值得时候,将会使用默认值
    public static void myMeth() {
        Test t = new Test();
        try {
            Class<?> clazz = t.getClass();
            Method method = clazz.getMethod("myMeth");
            MyAnno anno = method.getAnnotation(MyAnno.class);//当注解策略不是RUNTIME时,这里anno会得到null
            System.out.println(anno.str());//输出 测试注解
            System.out.println(anno.val());//输出 100
        } catch (NoSuchMethodException | SecurityException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        myMeth();
    }
}

先获取当前对象,获取Class对象 ,根据Class对象获取当前Method,根据Method 获取表明注解的值。

获取所有注解

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
    String str();
    int val();
}
@Retention(RetentionPolicy.RUNTIME)
public @interface What {
    String desription();
}
@MyAnno(str="测试类注解",val=100)
@What(desription="类描述")
public class Meta2 {
    @MyAnno(str="测试方法注解",val=200)
    @What(desription="方法描述")
    public static void test() {
        Meta2 m= new Meta2();
        try {
            Annotation[] annos = m.getClass().getAnnotations();
            for (Annotation annotation : annos) {
                System.out.println(annotation);
            }
//            输出如下 T8是包名
//            @T8.MyAnno(str=测试类注解, val=100)
//            @T8.What(desription=类描述)
            Method test = m.getClass().getMethod("test");
            Annotation[] annos2 = test.getAnnotations();
            for (Annotation annotation : annos2) {
                System.out.println(annotation);
            }
//            输出如下 T8是包名
//            @T8.MyAnno(str=测试方法注解, val=200)
//            @T8.What(desription=方法描述)
        }catch (Exception e) {

        }
    }

    public static void main(String[] args) {
        test();
    }
}

单成员注解

@Retention(RetentionPolicy.RUNTIME)
public @interface MySingle {
    String value() default "aaa";//单成员注解仅仅包含一个成员 ,假设只有一个成员,使用注解时就可以直接为该成员设置,而不需要指定成员名称,前提是成员名称必须是value
}
public class Single {
    @MySingle("this is a single annotation")//这里并没有指定  value =
    public static void test() throws Exception{
        Single s = new Single();
        Class<?> clazz = s.getClass();
        Method test = clazz.getMethod("test");
        MySingle mySingle = test.getAnnotation(MySingle.class);
        System.out.println(mySingle.value());//输出  this is a single annotation
    }

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

单值注解的其他用法

@Retention(RetentionPolicy.RUNTIME)
public @interface MySingle {
    String value() default "aaa";//这个仍然是单值成员

    int other() default 999;//其他成员必须有默认值
}
public class Single {
    @MySingle("this is a single annotation")//这里并没有指定  value =
    public static void test() throws Exception{
        Single s = new Single();
        Class<?> clazz = s.getClass();
        Method test = clazz.getMethod("test");
        MySingle mySingle = test.getAnnotation(MySingle.class);
        System.out.println(mySingle.value());//输出  this is a single annotation
        System.out.println(mySingle.other());//输出  999
    }

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

java的内置注解

@Retention 只能用于注解其他注解 ,用于指定保留策略

@Documented  只能用于注解其他注解 ,用于通知某个工具 注解将被文档化

@Target  只能用于注解其他注解 用于指定注解只能使用的场合,比如一下代码

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.CONSTRUCTOR})//这里的作用是指定MySingle 只能作用在域变量或者构造函数
public @interface MySingle {

}
ElementType枚举值如下表

@Inherited   只能用于注解其他注解 允许子类继承父类的注解。

@Override  方法重写注解

@Deprecated 过期注解

@FunctionalInterface 函数式接口注解,用于指定一个接口是一个函数式接口(并不是必须条件,该接口仅仅是提供信息)

@SuppressWarnings 抑制编译器的警告注解

原文地址:https://www.cnblogs.com/tjqBlog/p/9795381.html

时间: 2024-10-12 07:59:08

java语言基础--枚举,注解,正则和反射的相关文章

3.JAVA语言基础部分&mdash;Class类与反射

什么是Java反射机制? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的以及动态调用对象的方法的功能称为Java的反射机制. 反射机制提供了哪些功能? 在运行时判定任意一个对象所属的类 在运行时构造任意一个类的对象: 在运行时判定任意一个类所具有的成员变量和方法: 在运行时调用任意一个对象的方法: 生成动态代理: Java反射机制类: java.lang.Class; //类 java.lang.re

Java学习总结(二)----Java语言基础

1.     Java语言基础 2.1 关键字 定义:被java语言赋予特殊含义的单词 特点:关键字中的字母都为小写 用于定义数据类型的关键字 class,interface,byte,short,int, long ,float,double,char,boolean,void 用于定义数据类型值的关键字 true,false,null 用于定义流程控制的关键字 If,else,switch,case,default, while,do,for,break,continue,return 用于

day03&lt;Java语言基础+&gt;

Java语言基础(逻辑运算符的基本用法) Java语言基础(逻辑运算符&&和&的区别) Java语言基础(位运算符的基本用法1) Java语言基础(位异或运算符的特点及面试题) Java语言基础(位运算符的基本用法2及面试题) Java语言基础(三元运算符的基本用法) Java语言基础(三元运算符的练习) Java语言基础(键盘录入的基本格式讲解) Java语言基础(键盘录入的练习1) Java语言基础(键盘录入的练习2) Java语言基础(顺序结构语句) Java语言基础(选择结

java--学习java从这里开始:Java语言基础(1)《基础知识篇》--黑马程序员

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Java语言基础(1) 从这篇日记开始说一些关于java的语言基础知识, 1  Java语言概述 java的创始人——詹姆斯·高斯林(James Gosling) 1977年获得了加拿大卡尔加里大学计算机科学学士学位,1983年获得了美国卡内基梅隆大学计算机科学博士学位,毕业后到IBM工作,设计IBM第7一代工作站NeWS系统,但不受重视.后来转至Sun公司,1990年,与Patrick,Na

非专业码农 JAVA学习笔记 2 java语言基础

java语言基础 (一)程序构成 略 (二)数据类型变量和常量 1.数据类型(与c#差不多) 布尔bool 8位 字节byte 8   -128-127 字符char 16 短整型Short 16 Int 32 Long 64 Float 32 Double 64 2.标识符-变量常量方法对象和类的名字标记 字母数字 还有两个特殊符号_ 和$ 字母下划线或者美元符号开头 3.常量 4.变量 (三)表达式 1.赋值和强制类型转换 Tostring()弱转换 类型=(类型)变量:a=(int)b;a

[JAVA_开课吧资源]第一周 Java语言概述、Java语言基础

主题一 Java语言概述 » JDK介绍及其基本组件 Sun公司利用Java开发工具箱(Java Development Toolkit ,JDK)发布Java的各个版本.JDK由开发和测试Java程序的独立程序集组成,它们都从命令行调用. [请点击查看更多内容 转自51CTO.com] » 使用CMD开发运行Java程序 代码文件的拓展名必须为.java,并且文件名应该与类的类名完全相同.编译一个程序是指使用编译器将源代码翻译成java字节码.下面的命令用来编译源代码文件welcome.jav

第二章 java语言基础

2.1 java语言基础组成 关键字 标识符 注释 常量和变量 运算符 语句 函数 数组 2.1.1 标识符 1. 组成:由英文字母.数字._和$ 2. 规则: 不能以数字开头 不能使用关键字 3. java的命名规范 包名:所有字母都小写.xxyyy 类名:所有单词的首字母大写.XxxYy 变量名和函数名:第一个单词首字母小写,之后的每个单词首字母都大写.xxYyyZz 常量名:所有字母都大写,多个单词用下划线连接.XXX_YY 2.1.2 常量和变量 1. 常量:不能改变的数值 分类: 整数

day04&lt;Java语言基础+&gt;

Java语言基础(循环结构概述和for语句的格式及其使用) Java语言基础(循环结构for语句的练习之获取数据) Java语言基础(循环结构for语句的练习之求和思想) Java语言基础(循环结构for语句的练习之水仙花) Java语言基础(循环结构for语句的练习之统计思想) Java语言基础(循环结构while语句的格式和基本使用) Java语言基础(循环结构while语句的练习) Java语言基础(循环结构do...while语句的格式和基本使用) Java语言基础(循环结构三种循环语句

Java语言基础扫雷

一.数据类型 Java支持两种数据类型:基本类型和引用类型.基本类型有布尔(boolean)类型和数值类型,数值类型有整数类型(byte.short.char.int.long)和浮点数类型(float.double),其中char也称为字符类型,统称八大基本数据类型.byte型整数在内存中占8位,short型整数在内存中占16位,int型整数在内存中占32位,long型整数在内存中占64位,float型数值在内存中占32位,double型数值在内存中占64位.按取值范围从小到大排列为:byte