什么是注解(Annotation)
注解顾名思义为注释、讲解,可以理解为一种标签或标记,可以用在类、方法或者域上。向类、方法等添加注解,相当于给他们贴上了一层标签。
注解使用
在使用注解时,在类名、方法名、域上直接用@+注解名即可。比如一个叫做MyAnnotation的注解:
1.类注解
在类A上添加@MyAnnotaion,即用MyAnnotation注解了类A。方法、域同理。
@MyAnnotation
public class A{
}
2.方法注解
用MyAnnotation注解了方法method()。
@MyAnnotation
public void method(){
//TODO
}
3.域注解。
用MyAnnotation注解了域a
public class A{
@MyAnnotation
int a; //域a
}
自定义注解
java给我们提供了很多注解,有时我们需要自定义的注解。自定义注解和接口定义很像,比如我们定义一个叫做MyAnnotation的注解,像下面这样就定义好了。
public @interface MyAnnotation{
}
注解属性
注解的作用不只是一个名字那么简单,它可以包含许多属性,即成员变量,就像一张标签上可以写很多东西一样。所以可以在定义注解时添加各种属性。
public @interface MyAnnotation{
int id();
String msg();
}
MyAnnotation注解中的id、msg就是它的属性。可以看到定义属性,和在接口中定义方法类似。
定义属性过后,我们在使用注解时就可以加上属性值。如下在注解类A时,声明了属性id=0,msg为hello:
@MyAnnotation(id = 0,msg = "hello")
class A{
}
--注意--:
1.在使用注解时,属性都要赋值,如上面的id = 0,多个属性用逗号(,)隔开。
2.定义注解时可以给属性加上默认值,这样可以在使用的时候不用赋值。定义默认值用default,如下定义连个属性的默认值分别为1和“hi”
public @interface MyAnnotation{
int id() default 1;
String msg() default "hi";
}
3.如果一个注解内仅仅只有一个名字为 value 的属性时,可以直接在括号内填写属性值,如:
public @interface MyAnnotation{
int value();
}
使用时可以不需要value = 0,直接填写0,当然填写value=0也是正确的。
@MyAnnotation(0)
class A{
}
反射(Reflaction)获取注解
JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制。就像我们看世间万物,都是光反射进我们眼睛的结果,光反射是什么样,我们看到的就是什么样,为什么太空是黑的?就是因为太空没有灰尘反光。
JAVA的反射也是同理,我们需要获取类的信息时,就需要通过反射。注解的获取同样是通过反射。
- 获取注解有几个主要方法。
1.isAnnotationPresent()是否含有某个注解。
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}
比如获取类A是否有注解MyAnnotation,有返回true,没有返回false。
boolean b = A.class.isAnnotationPresent(MyAnnotation.class);
2.getAnnotation()获取某种注解对象。
public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {}
比如获取类A的注解对象。获取到后我们就得到应用在类A时该注解的属性值。
MyAnnotation m = A.class.getAnnotation(MyAnnotation.class);
int id = m.id();
String msg = m.msg();
3.getAnnotations()获取应用的所有注解,结果存进数组。
public Annotation[] getAnnotations() {}
- 除了用类调用上述方法,我们还可以获取到该类中的方法和域去调用。
假如类A有方法method(),有域a。
public class A{
int a;
public void myMethod(){
//TODO
}
}
1.获取类方法,参数为方法名字符串。
Method method = A.class.getDeclaredMethod("myMethod");
2.获取域
Field field = A.class.getDeclaredField("a");
网友评论