从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。
目录
*
* Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
* Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,
* Java 标注可以通过反射获取标注内容。
* 在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,
* 在运行时可以获取到标注内容 。
* 当然它也支持自定义 Java 标注。可以把注解理解为代码里的特殊标记
* 可以在附加在package、class、method、field等上面,相当于给他们添加量额外的辅助信息
* 可以通过反射机制编程实现对这些元数据的访问
* 格式:
* 注解是以“@注释名”在代码中存在的,还可以添加一些参数值,
* 如@SupperessWarnings(value="unchecked")
* 内置注解:
* 定义在java.lang包中,作用在代码中
* @Override: 检查该方法是否是重写方法,如果发现父类或引用的接口中没有这方法,编译器会报错
* @Deprecated:标记过时的方法。如果使用该注解标记的方法,会报编译警告
* @SuppressWarnings: 指示编译器忽略注解中声明的警告信息
* @FunctionalInterface:指定接口必须为函数式接口,如果编写的不是函数式接口,但是加上了
* @FunctionInterface,那么编译器会报错。“函数式接口”是指仅仅只包含一个抽象方法的接口
* @SafeVarargs:用来抑制堆污染警告
* 元注解:
* 元注解的作用是负责注解其他注解,用来对其他annotation类型作说明
* @Target: 用于描述注解的使用范围,即被描述的注解可以用在什么地方
* @Retention: 表示需要在什么级别保存该注释信息,用于描述注解的生命周期
* SOURCE<CLASS<RUNTIME
* @Document: 说明该注解将被包含在Javadoc中
* @Inherited: 说明子类可以继承父类的该注解
* */
public class _01_Annotation {
@Override // 覆写方法的注解
public String toString() {
return super.toString();
}
@Deprecated
public static void test(){
System.out.println("测试@Deprecated注解");
}
@SuppressWarnings("all")
public static void test_02(){
int i = 0;
System.out.println("测试@Deprecated注解");
}
public static void main(String[] args) {
test();
}
}
*
* 自定义注解
* 使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口
* 可以通过default声明参数的默认值
* 如果只有一个参数,一般参数名为value
* */
public class _02_Meta {
@MyAnnotation
String name;
// @Target标注了只能在方法上使用
@MyAnnotation
public static void test_01(){
System.out.println("测试自定义注解");
}
// 注解可以显式赋值,如果没有默认值,就必须赋值
@MyAnnotation_02(age = 18,name = "zpr",id = 999,schools = "hhhh")
public static void test_02(){}
@MyAnnotation_03("111")
public static void test_03(){}
public static void main(String[] args) {
test_01();
}
}
// 用{}可表示value适用于多种情况
@Target(value = {ElementType.METHOD,ElementType.FIELD})
// 指示带批注类型的注解要保留多长时间,即作用域不同
// RetentionPolicy.RUNTIME 表示该注解会伴随着程序一直存在,直到JVM退出
// RetentionPolicy.CLASS 表示该注解会存在与class文件中,但在JVM运行时将不会被保留
// RetentionPolicy.SOURCE 表示Annotation信息仅存在于编译器处理期间,编译完成时该注解被丢弃
@Retention(value = RetentionPolicy.CLASS)
// 表示是否将注解生成在JavaDoc中
@Documented
// 指示自动继承注解类型
@Inherited
// 定义一个注解
@interface MyAnnotation{
}
// ElementType.TYPE 能标注"类、接口(包括注释类型)或枚举声明"。
// FIELD 能标注"字段声明"。
// METHOD 能标注"方法"。
// PARAMETER 能标注"参数"。
// CONSTRUCTOR 能标注"构造方法"。
// LOCAL_VARIABLE 能标注"局部变量"。
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
// 自定义一个注解
@interface MyAnnotation_02{
// 注解的参数: 参数类型 + 参数名();
String name() default "123";
int age();
int id() default -1;
String[] schools() default {"北京大学","清华大学"};
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation_03{
// 如果注解只有一个参数。默认使用value。使用该注解时参数名value可以省略不写
String value();
}