一、概述
总体来说,Java中的注解就是对一段程序的描述,通过注解,我们可以直观的了解到该段代码是用来做什么的。
@Override
public String toString() {
return super.toString();
}
这样在编译时我们就能确定该方法是不是重写的父类中的方法,如果父类(或接口)中没有该方法,则会报错。
二、JDK内置注解
JDK已提前帮我们定义了一些注解,以下是常用的一些注解:
- @Override:检测该注解所标注的方法是否继承自父类(或接口);
- @Deprecated:表示该注解所标注的内容已过时(即所标注内容不推荐使用);
- @SuppressWarnings:抑制警告(需要传参数,一般使用“All”)
- @param:注解描述的是一个参数(生成文档时使用);
- @return:注解描述的是一个返回值(生成文档时使用)。
三、元注解
即描述注解的注解,我们打开@Override的源文件,可以看到该注解是这样定义的:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
我们可以看到注解的本质其实是一个接口,其中@Target和@Retention就属于元注解,他们用来描述Override注解的一些功能。
下面我们来看看Java中常用的元注解:
@Target:描述注解作用的位置,ElementType.METHOD表示作用于一个方法上;
@Retention:描述注解被保留的阶段,RetentionPolicy.SOURCE表示注解会在生成字节码文件后才被销毁;
@Documented:描述注解是否被抽取到API文档中;
@Inherited:描述注解是否被子类继承。
四、自定义注解
有以下三个步骤:
- 定义一个注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String methodName();
String className();
}
-
创建一个注解解析程序:
public class Demo { public static void main(String[] args) { Class rtClass = ReflectTest.class; MyAnnotation anno = rtClass.getAnnotation(MyAnnotation.class); String className = anno.className(); String methodName = anno.methodName(); System.out.println("className:" + className + "; methodName" + methodName); } }
-
使用注解:
@MyAnnotation(methodName = "myMethod", className = "learnAnnotation.ReflectTest")
public class ReflectTest {
public void myMethod() {
System.out.println("----------");
}
}