设为首页 加入收藏

TOP

一起来学Java注解(Annotation)(一)
2019-10-09 19:59:44 】 浏览:34
Tags:起来 Java 注解 Annotation

一. 什么是Annotation

我们在平时的开发过程中看到很多如@Override,@SuppressWarnings,@Test等样式的代码就是注解,注解是放到类、构造器、方法、属性、参数前的标记。

二. Annotation的作用

给某个类、方法..添加了一个注解,这个环节仅仅是做了一个标记,对代码本身并不会造成任何影响,需要后续环节的配合,需要其他方法对该注解赋予业务逻辑处理。就如同我们在微信上发了一个共享定位,此时并没有什么用,只有当后面其他人都进入了这个共享定位,大家之间的距离才能明确,才知道该怎么聚在一起。

注解分为三类:

2.1 编译器使用到的注解

如@Override,@SuppressWarnings都是编译器使用到的注解,作用是告诉编译器一些事情,而不会进入编译后的.class文件。

@Override:告诉编译器检查一下是否重写了父类的方法;

@SuppressWarnings:告诉编译器忽略该段代码产生的警告;

对于开发人员来说,都是直接使用,无需进行其他操作

2.2 .class文件使用到的注解

需要通过工具对.class字节码文件进行修改的一些注解,某些工具会在类加载的时候,动态修改用某注解标注的.class文件,从而实现一些特殊的功能,一次性处理完成后,并不会存在于内存中,都是非常底层的工具库、框架会使用,对于开发人员来说,一般不会涉及到。

2.3 运行期读取的注解

一直存在于JVM中,在运行期间可以读取的注解,也是最常用的注解,如Spring的@Controller,@Service,@Repository,@AutoWired,Mybatis的@Mapper,Junit的@Test等,这类注解很多都是工具框架自定义在运行期间发挥特殊作用的注解,一般开发人员也可以自定义这类注解。

三. 定义Annotation

我们使用@interface来定义一个注解

/**
 * 定义一个Table注解
 */
public @interface Table {
    String value() default "";
}
/**
 * 定义一个Colum注解
 */
public @interface Colum {
    String value() default "";
    String name() default "";
    String dictType() default "";
}

这样就简单地将一个注解定义好了

我们上面定义的注解主要用到了String类型,但实际上还可以是基本数据类型(不能为包装类)、枚举类型。

注解也有一个约定俗成的东西,最常用的参数应该命名为value,同时一般情况下我们都会通过default参数设置一个默认值。

但这样是不是就满足于我们的使用了呢,我想把@Table注解仅用于类上,@Colum注解仅用于属性上,怎么办?而且开始提到的三类注解,一般开发人员用的都是运行期的注解,那我们定义的是吗?

要回答这些问题,就需要引入一个概念“元注解”。

3.1 元注解

可以修饰注解的注解即为元注解,Java已经定义了一些元注解,我们可以直接使用。

3.1.1 @Target

顾名思义指定注解使用的目标对象,参数为ElementType[]

public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();
}

而下面是ElementType枚举中定义的属性,不设置Target的时候,除了TYPE_PARAMETER,TYPE_USE,其他地方都相当于配置上了。

public enum ElementType {
    /** 通过ElementType.TYPE可以修饰类、接口、枚举 */
    TYPE,

    /** 通过ElementType.FIELD可以修饰类属性 */
    FIELD,

    /** 通过ElementType.METHOD可以修饰方法 */
    METHOD,

    /** 通过ElementType.PARAMETER可以修饰参数(如构造器或者方法中的) */
    PARAMETER,

    /** 通过ElementType.CONSTRUCTOR可以修改构造器 */
    CONSTRUCTOR,

    /** 通过ElementType.LOCAL_VARIABLE可以修饰方法内部的局部变量 */
    LOCAL_VARIABLE,

    /** 通过ElementType.ANNOTATION_TYPE可以修饰注解 */
    ANNOTATION_TYPE,

    /** 通过ElementType.PACKAGE可以修饰包 */
    PACKAGE,

    /**
     * 可以用在Type的声明式前
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * 可以用在所有使用Type的地方(如泛型、类型转换等)
     *
     * @since 1.8
     */
    TYPE_USE
}

我们主要说一下ElementType.PACKAGE和1.8添加的ElementType.TYPE_PARAMETER和ElementType.TYPE_USE

ElementType.PACKAGE

@Target(ElementType.PACKAGE)
public @interface Table {
    String value() default "";
}

含义是用来修饰包,但我们用来修饰包的时候却提示错误

我们按照提示创建package-info.java文件,这里需要注意一下,通过IDE 进行new --> Java Class是创建不了的,需要通过new File文件创建

@Table
package annotation;
class PackageInfo {
    public void hello() {
        System.out.println("hello");
    }
}

ElementType.TYPE_PARAMETER和ElementType.TYPE_USE

这两个一起说,因为它们有相似之处。都是Java1.8后添加的

@Target(ElementType.TYPE_USE)
public @interface NoneEmpty {
    String value() default "";
}
@Target(ElementType.TYPE_PARAMETER)
public @interface NoneBlank {
    String value() default "";
}

很明显使用El

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

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目