反射與註解
阿新 • • 發佈:2019-02-03
註解其實是對類、方法、屬性這些位元組碼的進一步修飾
通過註解,可以輕鬆地對這些位元組碼作進一步擴充套件,而不需要修改原有的內容
而反射可以獲取到這些註解,那麼就可以對執行時的例項物件做進一步處理
註解和反射形成配合,將位元組碼的一部分共性抽離出來,通用地處理
其實@Table,@Column這些JPA註解,也是通過註解和反射的配合來完成的
下面用一個簡單的例子來描述註解和反射的配合:
先自定義一個註解MyAnnotation,註解裡的text()用來儲存一段文字資訊
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//在執行時註解依然存活
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
public String text();
}
算數類Calculation本身作用是求兩個數之和 ,現在使用自定義的註解對它作修飾,目的是在求和之後列印多一句話。
public class Calculation {
@MyAnnotation(text = "The result is")
public int add(int a, int b){
return a + b;
}
}
最後寫一個測試類
import java.lang.reflect.Method;
public class AnnotationTest {
public static void main(String[] args) throws Exception {
// 傳入位元組碼
test(Calculation.class);
}
public static void test(Class<?> clazz) {
try {
// 根據引數,獲取位元組碼裡面的對應方法
Method method = clazz.getMethod("add" , new Class[] { int.class, int.class });
// 通過位元組碼反射建立例項物件
Object object = clazz.newInstance();
// 獲取方法上的MyAnnotation註解
if (method.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation ma = method.getAnnotation(MyAnnotation.class);
// 獲取註解的內容
String text = ma.text();
// 反射呼叫例項物件的方法
Object result = method.invoke(object, new Object[] { 10, 1 });
System.out.println(text + " " + result);
}
} catch (Exception e) {
}
}
}
輸出結果:The result is 11