设为首页 加入收藏

TOP

一起来学Java注解(Annotation)(二)
2019-10-09 19:59:44 】 浏览:37
Tags:起来 Java 注解 Annotation
ementType.TYPE_PARMETER修饰的注解@NoneBlank无法在泛型使用的时候编译通过,仅能用于类的泛型声明,而通过ElementType.TYPE_USE修饰的注解@NoneEmpty可以。

3.1.2 @Retention

可以用于定义注解的生命周期,参数为枚举RetentionPolicy,包括了SOURCE,CLASS,RUNTIME

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
     * Returns the retention policy.
     * @return the retention policy
     */
    RetentionPolicy value();
}
public enum RetentionPolicy {
    /**
     * 仅存在于源代码中,编译阶段会被丢弃,不会包含于class字节码文件中.
     */
    SOURCE,

    /**
     * 【默认策略】,在class字节码文件中存在,在类加载的时被丢弃,运行时无法获取到
     */
    CLASS,

    /**
     * 始终不会丢弃,可以使用反射获得该注解的信息。自定义的注解最常用的使用方式。
     */
    RUNTIME
}

3.1.3 @Documented

表示是否将此注解的相关信息添加到javadoc文档中

3.1.4 @Inherited

定义该注解和子类的关系,使用此注解声明出来的自定义注解,在使用在类上面时,子类会自动继承此注解,否则,子类不会继承此注解。注意,使用@Inherited声明出来的注解,只有在类上使用时才会有效,对方法,属性等其他无效。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Person {
    String value() default "man";
}
@Person
public class Parent {
}
//子类也拥有@Person注解
class Son extends Parent {

}

3.2 定义注解小结

用@interface定义注解

可以添加多个参数,核心参数按约定用value,为每个参数可以设置默认值,参数类型包括基本类型、String和枚举

可以使用元注解来修饰注解,元注解包括多个,必须设置@Target@Retention@Retention一般设置为RUNTIME

四. Annotation处理

我们前面已经提到光配置了注解,其实没有作用,需要通过相应的代码来实现该注解想要表达的逻辑。

注解定义后也是一种class,所有的注解都继承自java.lang.annotation.Annotation,因此,读取注解,需要使用反射API。

//定义的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Colum {
    String value() default "";
    //用于表示某个属性代表的中文含义
    String name() default "";
}

用注解@Colum来修饰某个类的属性

public class Person {

    @Colum(name = "姓名")
    private String name;

    @Colum(name = "性别")
    private String gender;

    @Colum(name = "年龄")
    private int age;

    @Colum(name = "住址")
    private String address;

    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getGender() {return gender;}
    public void setGender(String gender) {this.gender = gender;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
    public String getAddress() {return address;}
    public void setAddress(String address) {this.address = address;}
}

通过反射读取这个类的所有字段的中文含义,并保存到list中,然后打印出来

public static void main(String[] args) throws ClassNotFoundException {
    List<String> columNames = new ArrayList<>();
    Class clazz = Class.forName("annotation.Person");
    //获取Person类所有属性
    Field[] fields = clazz.getDeclaredFields();
    for (Field field : fields){
        //获取该属性的Colum注解
        Colum colum = field.getAnnotation(Colum.class);
        //或者可以先判断有无该注解
        field.isAnnotationPresent(Colum.class);
        //将该属性通过注解配置好的中文含义取出来放到集合中
        columNames.add(colum.name());
    }

    //打印集合
    columNames.forEach((columName) -> System.out.println(columName));
}

结果如下:

姓名
性别
年龄
住址

比如我们有一些常见的应用场景,需要把网站上的列表导出成excel表格,我们通过注解的方式把列名配置好,再通过反射读取实体需要导出(是否需要导出,也可通过注解配置)的每个字段的值,从而实现excel导出的组件。

五. 总结

本文只是抛砖引玉地讲解了注解的基本概念,注解的作用,几种元注解的功用以及使用方法,并通过一个简单的例子讲解了一下注解的处理,并不全面,文中通过Field讲解了注解的基本Api,但注解还可以修饰类、构造器、方法等,也有相对应的注解处理方法,大家可自行查一下API手册相关内容,大同小异,有不对之处,请批评指正,望共同进步,谢谢!

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java深入学习(4):Future模式 下一篇Mybatis 映射器接口实现类的方式 ..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目