注解
1. 概述
-
注解(Annotation):是从JDK 5.0开始引入的新技术,也是和 class、 interface一样,是一种类型;借用 https://blog.csdn.net/qq1404510094/article/details/80577555 这个博主的理解就很恰到好处,他是这样说的:想象代码具有生命,注解就是对于代码中某些鲜活个体贴上去的一张标签,简化来说,注解就是标签;
-
Annotation的作用:
- 不是程序本身,可以对程序做出解释(这一点和注释(comment)没有什么区别);
- 可以被其他程序(比如:编译器等)读取;
-
Annotation的格式:
-
注解是以“@注释名”在代码中存在的,还可以添加一些参数值;
@SuppressWarnings(value = "unchecked").
-
-
Annotation 的使用:
- 可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元素数据的访问;
2. 内置注解
所谓的内置注解其实就是 java 里边已经存在的一些注解
-
@Override:定义在java.lang.Override中,此注解只适用于修饰方法,表示一个方法声明打算重写超类中的另一个方法声明;
public class Demo { @Override public String toString() { return "Demo{}"; } }
-
@Deprecated:定义在java.lang.Deprecated中,此注解可以用于修饰方法、属性、类,表示不鼓励程序员使用这样的元素(标记过时的元素),通常是因为它很危险或者存在更好的选择;
public class Demo { public static void main(String[] args) { //在idea中书写此代码,将会在调用Method方法时,被画上一条横线,代表该方法付过时,或者危险 new Demo().Method(); } @Deprecated public void Method() { } }
-
@SuppressWarnings:定义在java.long.SuppressWarnings中,用来抑制编译时的警告信息;
- 与之前的注解不同之处在于,需要添加参数才能正确时使用,这些参数都是已经定好了的;
- @SuppressWarnings(“all”) //镇压警告
- @SuppressWarnings(“unchecked”)
- @SuppressWarnings("value={“unchecked”, "deprecation “}”)
3. 元注解
-
作用:负责注解其他注解,Java中定义了4个标准的meta-annotation类型作说明;
-
这些类型和他们所支持的类在java.long.annotation包中可以找到。
-
@Target:用于描述注解的使用范围(即注解可以被使用在什么地方);
@Target(value = {ElementType.METHOD,ElementType.TYPE}) 其中,value有以下值可用: TYPE //Class, interface (including annotation type), or enum declaration FIELD //Field declaration (includes enum constants) METHOD // Method declaration PARAMETER //Formal parameter declaration CONSTRUCTOR // Constructor declaration LOCAL_VARIABLE //Local variable declaration ANNOTATION_TYPE //Annotation type declaration PACKAGE // Package declaration
@Target(value={ElementType.METHOD, ElementType.FIELD}) @interface MyAnnotation { }
-
@Retention:表示需要在什么级别保存该注解信息,用于描述注解的声明周期(也就是存活时间);
//注解可以保留到程序运行的时候,它会被加载到 JVM 中,所以在程序运行时可以获取到它们; 默认 @Retention(value = RetentionPolicy.RUNTIME) //注解只被保留到编译进行的时候,它并不会被加载到 JVM 中; @Retention(value = RetentionPolicy.CLASS) //注解只在源码阶段保留,在编译器进行编译时它将会被丢弃忽视; @Retention(value = RetentionPolicy.SOURCE)
@Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation { }
-
@Documented:说明该注解将被包含在javadoc中;
@Documented
-
@lnherited:说明子类可以继承父类的该注解,但是它并不是说注解本身可以被继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解;
@MyAnnotation public class Father{ } public class Son extends Father{ } //自定义注解:(稍后会讲) @Retention((RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD,ElementType.TYPE}) @Inherited @interface MyAnnotation { } /* 因为自定义注解 MyAnnotation 被 @Inherited 修饰过,之后父类又被 MyAnnotation 注解, 子类继承父类且没有应用任何注解,那么子类也就拥有了 MyAnnotation 这个自定义的注解; */
-
4. 自定义注解
-
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口
-
分析:
-
@interface用来声明一个注解,
格式:public @interface 注释名{定义内容};
-
其中的每一个方法实际上是声明了一个配置参数;
-
方法的名称就是参数的名称;
-
返回值类型就是参数的类型(返回值只能是基本类型,Class,String,enum);
-
可以通过default来声明参数的默认值;
-
如果只有一个参数成员,一般参数名为value;
-
注解元素必须要有值,我们定义注解元素时,经常使用空字符串,0作为默认值;
-
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*
自定义注解
*/
public class Demo02UsrDefined {
//注解可以显示赋值,如果没有默认值,一定要给注解赋值
//赋值没有顺序
@AnnotationDemo01(name = "权威",schools = {"1","2"})
public void test(){
}
}
//加上元注解
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface AnnotationDemo01{
//注解的参数:参数类型 + 参数名();
String name();
// String name() default ""; default是默认的意思
int age() default 0;
int id() default -1; //默认值为-1代表不存在
String[] schools();
}