一、什么是注解
官方定义:注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。
注解有许多用处,主要如下:
- 提供信息给编译器: 编译器可以利用注解来探测错误和警告信息
- 编译阶段时的处理: 软件工具可以用来利用注解信息来生成代码、Html文档或者做其它相应处理。
- 运行时的处理: 某些注解可以在程序运行的时候接受代码的提取
自己的理解:注解就是用来标记类,属性,或方法的标签。
在java中有两种注解:1.元注解 2.自定义注解
元注解又是什么呢?可以这么理解,元注解就是标记我们自定义注解的标签。然而这些标签有什么作用呢?先来看一下下面的例子:
二、注解的作用:
首先我们定义一个自己的注解(标签)
package annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTag {
String name() default "hh";//默认值
int age() default 0;
}
我们来测试一下
package annotation;
import java.lang.reflect.Field;
public class AnnotationTest {
@MyTag(name = "xyp")
public String name;
@MyTag(age = 18)
public int age;
public static void main(String[] args){
AnnotationTest an = new AnnotationTest();
an.say();
}
public void say() {
System.out.println(name + ":" + age);
}
}
运行结果:
咦?说好的xyp:18呢?怎么没有出现预期效果?到这里其实我们只是定义了我们的标签,还没给我们的标签“赋能”呢,接下来看看给标签赋能后的效果:
package annotation;
import java.lang.reflect.Field;
public class AnnotationTest {
@MyTag(name = "xyp")
public String name;
@MyTag(age = 18)
public int age;
public static void main(String[] args) throws IllegalArgumentException,
IllegalAccessException {
AnnotationTest an = new AnnotationTest();
Class clazz = an.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
if (f.isAnnotationPresent(MyTag.class)) {
if (f.getName().equals("name")) {
f.set(an, f.getAnnotation(MyTag.class).name());
}
if (f.getName().equals("age")) {
f.set(an, f.getAnnotation(MyTag.class).age());
}
}
}
an.say();
}
public void say() {
System.out.println(name + ":" + age);
}
}
我们再来看看运行效果:
如常所愿,我们的注解起作用了,反射结合我们的注解(标签)发挥了它真正的威力,我们的注解标记好之后,然后对注解的地方做一系列猛如虎的操作,指哪打哪。想想以前我们看到各种框架里面的@Test啊@service啊什么的都是这样的原理,瞬间是不是世界清晰了很多。
下面是一篇写得好的注解:https://blog.csdn.net/briblue/article/details/73824058