java 注解与反射_Java注解与反射直接上手
什么是注解(Annotation)
注解顧名思義為注釋、講解,可以理解為一種標(biāo)簽或標(biāo)記,可以用在類、方法或者域上。向類、方法等添加注解,相當(dāng)于給他們貼上了一層標(biāo)簽。
注解使用
在使用注解時(shí),在類名、方法名、域上直接用@+注解名即可。比如一個(gè)叫做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給我們提供了很多注解,有時(shí)我們需要自定義的注解。自定義注解和接口定義很像,比如我們定義一個(gè)叫做MyAnnotation的注解,像下面這樣就定義好了。
public @interface MyAnnotation{
}
注解屬性
注解的作用不只是一個(gè)名字那么簡單,它可以包含許多屬性,即成員變量,就像一張標(biāo)簽上可以寫很多東西一樣。所以可以在定義注解時(shí)添加各種屬性。
public @interface MyAnnotation{
int id();
String msg();
}
MyAnnotation注解中的id、msg就是它的屬性。可以看到定義屬性,和在接口中定義方法類似。
定義屬性過后,我們在使用注解時(shí)就可以加上屬性值。如下在注解類A時(shí),聲明了屬性id=0,msg為hello:
@MyAnnotation(id = 0,msg = "hello")
class A{
}
--注意--:
1.在使用注解時(shí),屬性都要賦值,如上面的id = 0,多個(gè)屬性用逗號(hào)(,)隔開。
2.定義注解時(shí)可以給屬性加上默認(rèn)值,這樣可以在使用的時(shí)候不用賦值。定義默認(rèn)值用default,如下定義連個(gè)屬性的默認(rèn)值分別為1和“hi”
public @interface MyAnnotation{
int id() default 1;
String msg() default "hi";
}
3.如果一個(gè)注解內(nèi)僅僅只有一個(gè)名字為 value 的屬性時(shí),可以直接在括號(hào)內(nèi)填寫屬性值,如:
public @interface MyAnnotation{
int value();
}
使用時(shí)可以不需要value = 0,直接填寫0,當(dāng)然填寫value=0也是正確的。
@MyAnnotation(0)
class A{
}
反射(Reflaction)獲取注解
JAVA中反射是動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的一種反射機(jī)制。就像我們看世間萬物,都是光反射進(jìn)我們眼睛的結(jié)果,光反射是什么樣,我們看到的就是什么樣,為什么太空是黑的?就是因?yàn)樘諞]有灰塵反光。
JAVA的反射也是同理,我們需要獲取類的信息時(shí),就需要通過反射。注解的獲取同樣是通過反射。
獲取注解有幾個(gè)主要方法。
1.isAnnotationPresent()是否含有某個(gè)注解。
public boolean isAnnotationPresent(Class extends Annotation> annotationClass) {}
比如獲取類A是否有注解MyAnnotation,有返回true,沒有返回false。
boolean b = A.class.isAnnotationPresent(MyAnnotation.class);
2.getAnnotation()獲取某種注解對(duì)象。
public A getAnnotation(Class annotationClass) {}
比如獲取類A的注解對(duì)象。獲取到后我們就得到應(yīng)用在類A時(shí)該注解的屬性值。
MyAnnotation m = A.class.getAnnotation(MyAnnotation.class);
int id = m.id();
String msg = m.msg();
3.getAnnotations()獲取應(yīng)用的所有注解,結(jié)果存進(jìn)數(shù)組。
public Annotation[] getAnnotations() {}
除了用類調(diào)用上述方法,我們還可以獲取到該類中的方法和域去調(diào)用。
假如類A有方法method(),有域a。
public class A{
int a;
public void myMethod(){
//TODO
}
}
1.獲取類方法,參數(shù)為方法名字符串。
Method method = A.class.getDeclaredMethod("myMethod");
2.獲取域
Field field = A.class.getDeclaredField("a");
總結(jié)
以上是生活随笔為你收集整理的java 注解与反射_Java注解与反射直接上手的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android公共jar,使用JitPa
- 下一篇: Java 捕获 mybatis异常_3