zoukankan      html  css  js  c++  java
  • java:注解(二)

    自定义注解

    使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。以上所有例子都属于自定义注解。自定义注解具有以下固定格式:

    public @interface 注解名{注解体}

    所有基本数据类型(int,float,boolean,byte,double,char,long,short)
    String类型
    Class类型
    enum类型
    Annotation类型
    以上所有类型的数组

    注意:只能有public或默认(default)这两个访问权修饰,参数成员只能用以上6种类型,如果只有一个参数成员,最好把参数名称设为”value”。

    Shade 形状注解:

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Shade {

    public enum ShadeType {
    Triangle("三角"),
    Four("四边"),
    Five("五角");

    private String type;

    ShadeType(String type) {
    this.type = type;
    }

    @Override
    public String toString() {
    return type;
    }
    }

    public ShadeType shader() default ShadeType.Triangle;

    }

    读取注解

    这里我们将使用反射去读取注解。Java在java.lang.reflect 包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素。该接口主要有如下几个方法:

    default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

    判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false。

    <T extends Annotation> T getAnnotation(Class<T> var1);

    返回该程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。

    Annotation[] getAnnotations();

    返回该程序元素上存在的所有注解。

    Annotation[] getDeclaredAnnotations();

    返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

    public static void getInfo(Class<?> clazz) {
    // 获取该类所有声明的方法
    Field[] fields = clazz.getDeclaredFields();

    if (fields == null) return;

    for (Field field : fields) {

    if (field.isAnnotationPresent(Mode.class)) {
    Mode m0 = field.getAnnotation(Mode.class);
    System.out.println("****name=" + m0.value());
    }

    if (field.isAnnotationPresent(Shade.class)) {
    Shade s0 = field.getAnnotation(Shade.class);
    System.out.println("****shade=" + s0.shader().toString());
    }

    if (field.isAnnotationPresent(People.class)) {
    People p0 = field.getAnnotation(People.class);
    System.out.println("****name=" + p0.Name() + "**age=" + p0.Age() + "**price=" + p0.Price());
    }
    }

    }

    使用自定义注解:

    public class User {

    @Mode(value = "小石头")
    public String name;

    @Shade(shader = Shade.ShadeType.Five)
    public String shape;

    @People(Age = 18, Price = 100f, Name = "小宝")
    public int profile;

    }

    运行:

    getInfo(User.class);

    打印:

    ****name=小石头 ****shade=五角 ****name=小宝**age=18**price=100.0

    自定义注解
    自定义注解

    使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。以上所有例子都属于自定义注解。自定义注解具有以下固定格式:

    public @interface 注解名{注解体}

    所有基本数据类型(int,float,boolean,byte,double,char,long,short)
    String类型
    Class类型
    enum类型
    Annotation类型
    以上所有类型的数组

    注意:只能有public或默认(default)这两个访问权修饰,参数成员只能用以上6种类型,如果只有一个参数成员,最好把参数名称设为”value”。

    Shade 形状注解:

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Shade {

    public enum ShadeType {
    Triangle("三角"),
    Four("四边"),
    Five("五角");

    private String type;

    ShadeType(String type) {
    this.type = type;
    }

    @Override
    public String toString() {
    return type;
    }
    }

    public ShadeType shader() default ShadeType.Triangle;

    }

    读取注解

    这里我们将使用反射去读取注解。Java在java.lang.reflect 包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素。该接口主要有如下几个方法:

    default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

    判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false。

    <T extends Annotation> T getAnnotation(Class<T> var1);

    返回该程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。

    Annotation[] getAnnotations();

    返回该程序元素上存在的所有注解。

    Annotation[] getDeclaredAnnotations();

    返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

    public static void getInfo(Class<?> clazz) {
    // 获取该类所有声明的方法
    Field[] fields = clazz.getDeclaredFields();

    if (fields == null) return;

    for (Field field : fields) {

    if (field.isAnnotationPresent(Mode.class)) {
    Mode m0 = field.getAnnotation(Mode.class);
    System.out.println("****name=" + m0.value());
    }

    if (field.isAnnotationPresent(Shade.class)) {
    Shade s0 = field.getAnnotation(Shade.class);
    System.out.println("****shade=" + s0.shader().toString());
    }

    if (field.isAnnotationPresent(People.class)) {
    People p0 = field.getAnnotation(People.class);
    System.out.println("****name=" + p0.Name() + "**age=" + p0.Age() + "**price=" + p0.Price());
    }
    }

    }

    使用自定义注解:

    public class User {

    @Mode(value = "小石头")
    public String name;

    @Shade(shader = Shade.ShadeType.Five)
    public String shape;

    @People(Age = 18, Price = 100f, Name = "小宝")
    public int profile;

    }

    运行:

    getInfo(User.class);

    打印:

    ****name=小石头 ****shade=五角 ****name=小宝**age=18**price=100.0

    使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。以上所有例子都属于自定义注解。自定义注解具有以下固定格式:

    public @interface 注解名{注解体}

    所有基本数据类型(int,float,boolean,byte,double,char,long,short)
    String类型
    Class类型
    enum类型
    Annotation类型
    以上所有类型的数组

    注意:只能有public或默认(default)这两个访问权修饰,参数成员只能用以上6种类型,如果只有一个参数成员,最好把参数名称设为”value”。

    Shade 形状注解:

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Shade {

    public enum ShadeType {
    Triangle("三角"),
    Four("四边"),
    Five("五角");

    private String type;

    ShadeType(String type) {
    this.type = type;
    }

    @Override
    public String toString() {
    return type;
    }
    }

    public ShadeType shader() default ShadeType.Triangle;

    }

    读取注解

    这里我们将使用反射去读取注解。Java在java.lang.reflect 包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素。该接口主要有如下几个方法:

    default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

    判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false。

    <T extends Annotation> T getAnnotation(Class<T> var1);

    返回该程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。

    Annotation[] getAnnotations();

    返回该程序元素上存在的所有注解。

    Annotation[] getDeclaredAnnotations();

    返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

    public static void getInfo(Class<?> clazz) {
    // 获取该类所有声明的方法
    Field[] fields = clazz.getDeclaredFields();

    if (fields == null) return;

    for (Field field : fields) {

    if (field.isAnnotationPresent(Mode.class)) {
    Mode m0 = field.getAnnotation(Mode.class);
    System.out.println("****name=" + m0.value());
    }

    if (field.isAnnotationPresent(Shade.class)) {
    Shade s0 = field.getAnnotation(Shade.class);
    System.out.println("****shade=" + s0.shader().toString());
    }

    if (field.isAnnotationPresent(People.class)) {
    People p0 = field.getAnnotation(People.class);
    System.out.println("****name=" + p0.Name() + "**age=" + p0.Age() + "**price=" + p0.Price());
    }
    }

    }

    使用自定义注解:

    public class User {

    @Mode(value = "小石头")
    public String name;

    @Shade(shader = Shade.ShadeType.Five)
    public String shape;

    @People(Age = 18, Price = 100f, Name = "小宝")
    public int profile;

    }

    运行:

    getInfo(User.class);

    打印:

    ****name=小石头 ****shade=五角 ****name=小宝**age=18**price=100.0

  • 相关阅读:
    浅谈if __name__='__main__'
    python打开文件方式
    关于ValueError: not enough values to unpack (expected 4, got 1)
    一篇文章让你搞懂this
    Cannot read property 'addEventListener' of null报错的解决办法
    看JS操作符中二进制补码
    js的原型和原型链理解
    你不知道的js中对象,数组互相转换
    浅谈js中a+++a与a+a++值区别
    Integer跟int的区别
  • 原文地址:https://www.cnblogs.com/mrxiaohe/p/6381905.html
Copyright © 2011-2022 走看看