基础概念
package com.itlwc;
// 枚举类型指定范围
enum RetentionPolicy {
CLASS, // 只在编译之后class中起作用
RUNTIME, // 在运行的时候起作用,因此可以反射性地读取
SOURCE, // 只在源代码中起作用
}
// 枚举类型指定作用范围
enum ElementType {
ANNOTATION_TYPE, // 注释类型出现
CONSTRUCTOR, // 构造方法出现
FIELD, // 字段声明(包括枚举常量)出现
LOCAL_VARIABLE, // 局部变量声明出现
METHOD, // 方法声明出现
PACKAGE, // 包声明出现
PARAMETER, // 参数声明出现
TYPE, // 类,接口(包括注释类型)或枚举声明出现
}
// 文档注释格式,如果出现则其注释将出现在doc文档中
@interface Documented {
}
// 指示注释类型的注释要保留多久,如果不存在Retention注释,则默认为RetentionPolicy.CLASS
@interface Retention {
public RetentionPolicy value();
}
// 可以出现在那些元素之上,如果不存在Target注释,则声明的类型可以用任意元素之上
@interface Target {
public ElementType[] value();
}
@Documented
@Retention(value = RetentionPolicy.SOURCE)
@Target(value = { ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR })
public class Test {
public static void main(String[] args) {
}
}
系统内置Annotation
@Override
java.lang.Override,注解类型的
声明
@Target(value=METHOD)
@Retention(value=SOURCE)
public @interface Override
用在方法之上,用来告诉编译器这个方法重写了父类的方法
@Deprecated
java.lang.Deprecated,注解类型的
声明
@Documented
@Retention(value=RUNTIME)
public @interface Deprecated
用在方法之上,表示方法不建议使用(表示有危险或者有更好的代替)
@SuppressWarnings
java.lang.SuppressWarnings,注解类型的
声明
@Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
@Retention(value=SOURCE)
public @interface SuppressWarnings
括号里面的是value等于一个数组,表示方法是
@SuppressWarnings(value={"unchecked","unused"})
也可以写成下面这种
@SuppressWarnings({"unchecked", "unused"})
@Inherited
java.lang.Inherited,注解类型的
声明
@Documented
@Retention(value=RUNTIME)
@Target(value=ANNOTATION_TYPE)
public @interface Inherited
表示一个Annotation能否被使用类的子类继承下去,如果没写,则无法继承
自定义Annotation
package com.itlwc;
enum Color {
RED, GREEN, BLUE;
}
@interface Annotation {
public String key();
//使用默认值
public String value() default "牛小俊";
//使用枚举
public Color color() default Color.RED;
//使用数组
public String[] url();
}
@Annotation(
key = "lwc",
value = "李文超",
color = Color.GREEN,
url = { "www.baidu.com", "www.guge.com" }
)
public class Test {
}
通过反射取得方法上所有Annotation
package com.itlwc;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
class Info {
@Override
@Deprecated
@SuppressWarnings(value = "")
public String toString() {
return "hello";
}
}
public class Test {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("com.itlwc.Info");
Method methods = cls.getMethod("toString");
Annotation[] annotations = methods.getAnnotations();
for (Annotation a : annotations) {
System.out.println(a);
}
}
}
/*
打印结果:
@java.lang.Deprecated()
这个例子说明了Runtime中只能找到@Deprecated
*/