java 注解与反射_Java注解与反射直接上手
什么是注解(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 getAnnotation(Class 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");
總結
以上是生活随笔為你收集整理的java 注解与反射_Java注解与反射直接上手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android公共jar,使用JitPa
- 下一篇: java弹球轨迹运动解说,动态弹球的实现