自定义注解

之前在开发中,就总纳闷,为什么继承接口时,会出现@Override注解,有时候还会提示写注解@SuppressWarnings?

原来这是java特有的特性,注解!

  那么什么是注解呢?

  注解就是某种注解类型的一个实例,我们可以用它在某个类上进行标注,这样编译器在编译我们的文件时,会根据我们自己设定的方法来编译类。

注解都是什么呢?看下面这张图就明白了!

自定义注解

上面的图可以看出,注解大体上分为三种:标记注解,一般注解,元注解

@Override用于标识,该方法是继承自超类的。这样,当超类的方法修改后,实现类就可以直接看到了。

而@Deprecated注解,则是标识当前方法或者类已经不推荐使用,如果用户还是要使用,会生成编译的警告。

其他的不多说了,标准元注解 都是干嘛的呢?

  @Documented 标记生成javadoc

  @Inherited 标记继承关系

  @Retention 注解的生存期

  @Target 标注的目标

下面我们自己做一个注解!

首先声明一个接口,并未它添加注解内容!

package testAnnotation;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Person{
    String name();
    int age();
}

一般来说,注解都是搭配反射的解析器共同工作的。然后利用反射机制查看类的注解内容

package testAnnotation;

@Person(name="xingoo",age=25)
public class test3 {
    public static void print(Class c){
        System.out.println(c.getName());
        
        //java.lang.Class的getAnnotation方法,如果有注解,则返回注解。否则返回null
        Person person = (Person)c.getAnnotation(Person.class);
        
        if(person != null){
            System.out.println("name:"+person.name()+" age:"+person.age());
        }else{
            System.out.println("person unknown!");
        }
    }
    public static void main(String[] args){
        test3.print(test3.class);
    }
}

运行结果,读取到了注解的内容

testAnnotation.test3
name:xingoo age:25

案例:自定义注解用于扫描映射器(Spring集成Mybatis时候可能会用到)

java代码:

package annotations;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * 
 * @MyBatisRepository 用于映射器的特定注解
 *
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface MyBatisRepository {

}

Retention形态

java.lang.annotation.Retention形态可以在定义Annotation注解时,指示编译程序如何对待自定义的Annotation形态。

预设上编译程序会将Annotation信息停留在.class文件中,但是不会被JVM读取。

在使用Retention形态时,需要提供java.lang.annotation.RetentionPolicy形态方针,一共有三种:

class:这种类型的Annotation编译时会被保留,在class文件中存在,但是不被JVM读取。

source:这种类型的Annotation只会在源代码级别保留,编译后就会被忽略,所以不会保留在class文件中。

runtime:这种类型的Annotation将会被JVM保留,所以它们能在运行的时候被JVM或者是其他反射机制的代码进行读取和使用。

总结

实际上,我们在开发中,经常会是使用注解的方式来去完成一些功能,比如说权限,日志等。我们在定义注解的时候,其实更多的是使用的是Retention中的runtime形态,这样在放射的时候才会拿到注解上的信息来去完成我们的功能。注解使用非常广泛,需要特别掌握。