系列文章目录
Java 注解与反射 01 —— 注解
Java 注解与反射 02 —— 反射
什么是注解
Java 从 JDK 5.0 引入注解(Annotation)。
Annotation的作用:
- 不是程序本身,但可以对程序做出解释。(这一点和注释类似)
- 可以被其他程序(例如编译器)读取。
Annotation的格式:@注释名,也可以添加一些参数值,例如:@SuppressWanings(value=“unchecked”)。
Annotation可以附加在package,class,method,field等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元素的访问。
内置注解
-
@Override :这个我们经常看到,没错,就是表示某个方法将重写超类中的一个方法。若重写出错,会出现提示。
-
@Deprecate:该注解可用于修饰方法、属性、类,表示不鼓励程序员用这样元素(会出现删除线),可能是因为有危险或有更好选择。(但我们仍可使用)
-
SuppressWarning:用于抑制编译时的警告信息,但一般不推荐使用,警告还是有必要的。同时,这个注解需要添加参数。
- @SuppressWarning(“all”)
- @SuppressWarning(“unchecked”)
- @SuppressWarning(value={“unchecked”, “deprecation”})
- …
元注解
元注解的作用是负责注解其他注解,Java 定义了四个标准的 meta-annotation 类型,用于对其他 annotation 类型进行说明。当我们自定义一个注解的时候会用到这个,同时后面学习一些常用框架也会用到。
- @Target:用于描述注解的使用范围。参数都是枚举类型ElementType。
- TYPE : 类、接口或枚举声明
- FIELD: 域(属性)声明
- METHOD: 方法声明
- PARAMETER: 参数声明
- CONSTRUCTOR: 构造方法声明
- LOCAL_VARIABLE:局部变量声明
- ANNOTATION_TYPE:注释类型声明
- PACKAGE: 包声明
- TYPE_PARAMETER:jdk 1.8新增,标注类型参数
- TYPE_USE:jdk 1.8 新增,标注类型名称
- @Retention:表示该注解的生命周期。
- SOURCE:注解只保留在源文件中,在编译成class文件的时候被遗弃
- CLASS :注解被保留在class中,但是在jvm加载的时候被抛弃,这个是默认的声明周期。
- RUNTIME :注解在jvm加载的时候仍被保留。
- RUNTIME > CLASS > SOURCE,一般用runtime就好。
- @Documented:表明该注解会写入JavaDoc中。
- Inherited:表明子类能继承父类中的这个注解。
我们可以看看内置注解 @Deprecated 的源码。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={
CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
这里 @Target 定义该注解范围可以是 CONSTRUCTOR、FIELD、LOCAL_VARIABLE、METHOD、PACKAGE、TYPE,同时该注解生命周期将持续到运行完,也会被生成到 JavaDoc 中。
自定义注解
直接上代码
package lessen09_Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@ClassNameAnnotation("TestAnnotation")
public class TestAnnotation {
@MethodAnnotation(methodName = "test1", parameterNum = 2, parameterName = {
"a", "b"})
public static void test1(int a, int b){
System.out.println("deprecate");
}
}
/**
* 只有一个参数时,最好参数名用value,
* 这样后面用该参数时可省略参数名
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface ClassNameAnnotation{
String value();
}
/**
* 自定义的注解里可有多个参数,
* 可以为参数指定默认值
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MethodAnnotation{
String methodName();
int parameterNum() default 0;
String[] parameterName() default {
};
}