1、所有的注解都是类
2、所有注解类都默认是Annotation接口的子类
3、定义方式:
public @interface SomeAnnotation{
}
4、可以注解的位置
类上
方法上
成员变量上
返回值上
参数上
局部变量上
import org.junit.Test;
@MyTest
public class RunTest {
@MyTest
private int age;
@MyTest()
public void tt(@MyTest()int a){
@MyTest
int xx=0;
}
}
5、如果定义了一个注解之后,没有说明这个注解可以注解的位置,则这个注解就可以注解到所有位置上
可以通过另一个注解,来限制自定义的注解的注解可以注解的位置
以下定义某个注解只可以注解到方法上:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
//设定注解可以注解的位置
@Target(value={ElementType.METHOD})
public @interface MyTest {
}
6:用途
6.1:在编译时起到限制的作用.
public class MyServlet extends HttpServlet {
@Override
public void doGet(ServletRequest req,String name)
throws ServletException, IOException {
}
[因为父类中没有这个方法所以添加了@Overried以后,就会编译出错。]}
6.2:在运行时组反射使用
所有类的字节码Class,Method,Field,Constractor都拥有一个方法:
boolean isAnnotationPresent(Class<? extends Annotation>?annotationClass)
如果指定类型的注解存在于此元素上,则返回 true,否则返回 false。
注解存在的范围:
一个类:Retention,用于定义注解存在的策略:
java.lang.annotation
枚举 RetentionPolicy
三个常量:
CLASS
??????????编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。 在.class存在,在运行时擦除
RUNTIME
??????????编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。运行时存在。
SOURCE
??????????编译器要丢弃的注释。只在.java文件中存在@Overied
以下是经常使用的标准定义:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)[指定在运行存在。]
@Target(value={ElementType.METHOD})[注解的位置。]
public @interface MyTest {
}