目录
简述注解作用
注解(Annotation),注解是jdk5加入的一种注释机制,并且编译之后虚拟机还能识别这些注解;简单的来说就是注释和解读,注释是给编写程序的人看的,解读是交给java来解读的,框架中也类似的有很多的注解例如(Spring中的Service,Compent等)。
常见的注解以及它们的作用
代码中的注解
@Override:方法重写的注解
@Deprecated:废弃标识注解
@SuppressWarnings:镇压提醒注解
元注解(注解的注解)
@Documented:标注注解是否标注在文档中
@Inherited:标记注解是继承与哪个类
@Retention:标注注解怎么保存
@Target:标注注解能在哪里生效
作用说明
@Override
这个比较常见我们经常重写一些方法时就会默认生成这样的注解,该注解就是表示该方法是重写的方法,该注解能发现其父类,或者是引用的接口中有没有该方法时,没有就会报编译错误。
重写Object类的toString()方法。
@Deprecated
这个注解用在方法上表示该方法是过时的方法,不推荐使用,但是可以使用。多见于一些过时的方法上,例如下面图片中的java.lang.String类中。
@SuppressWarnings
代码中经常会有些提示,例如变量定义之后没有使用就会出现浅色,某些语句下面会有黄色波浪线,这些都是提醒,如果不想让它一直提醒就可以加上该注解。如下图使用前和使用后。
-------------->
@Retention
@Target
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
通过jdk中的@Override和@Deprecated来学习元注解
Override中的Target中表示该注解能作用的地方,例如和这个Override的作用范围是方法上对应的参数就是ElementType.METHOD也就是只能作用在方法上,对应的Deprecated的Target是一个字符串数组包含构造器、文件、方法、包等等,所以该Deprecated注解可以写在更多的不同类型上。
Retention表示的是该注解其中RetentionPolicy 是一个枚举类型,源码如下只有三个值。
SOURCE:表示源代码中
CLASS:表示在class字节码中,但LVM运行时不保留
RUNTIME:表示由编译器记录在类文件中,JVM运行时保留,并且能通过反射读取
public enum RetentionPolicy {
/**
* Annotations are to be discarded by the compiler.
*/
SOURCE,
/**
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.
*/
CLASS,
/**
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
*
* @see java.lang.reflect.AnnotatedElement
*/
RUNTIME
@Documented
标注注解是否生成在文档中
@Inherited
标记注解是继承与哪个类,注解类上时表示子类会继承该注解
自定义注解测试
这里自定义了两个注解(myAnnotation 和 myAnnotation2)
自定义注解格式 修饰符 @interface <注解名字>
package org.example.test;
import java.lang.annotation.*;
@myAnnotation()
public class TestAnnotiation {
//@myAnnotation() 出错因为该注解只能用于class上
public void test01(){
int a = 1;
}
@myAnnotation2(value = 999,name = "这是我自定义的注解2")
public void test02(){
System.out.println("这是测试自定义注解的一个方法");
}
}
/**
* 该注解只能用在类上
* 该注解最大限度的有效
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented()
@interface myAnnotation{ }
/**
* 该注解能用在方法上还能用在类上
* 该注解只能在源代码中有效
*/
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
@interface myAnnotation2{
int value();
String name();
}