對(duì)java的Annotation不是太熟悉,不過最近又要用,所以就找了相關(guān)的文檔看了下,并寫了一個(gè)Demo
基本的需求如下:
Server根據(jù)對(duì)方傳遞的類型碼找到具體的某個(gè)類的具體方法并運(yùn)行。個(gè)人覺得用Annotation去注釋代碼比較好,也減少配置文件,所以就體驗(yàn)了一把。
具體代碼如下:
1、先定義一個(gè)自己的Annotation
@Retention(RetentionPolicy.RUNTIME)
public @interface CodeAnnotation {
String code();
}
這里一定要將自己的Annotation定義為運(yùn)行時(shí)的,默認(rèn)好像是編譯時(shí)的,所以無法動(dòng)態(tài)的根據(jù)server接收到的code去匹配函數(shù)
2、@Override定義父類basicHandler通過放射去獲取執(zhí)行子類的方法
public Message execute(Message message) {
String code = message.getCode();
String className = this.getClass().getName();
Message msg = null;
try {
for (Method m : Class.forName(className).getMethods()) {
if (m.getAnnotation(CodeAnnotation.class) != null) {
if (code.equals(m.getAnnotation(CodeAnnotation.class).code())) {
try {
msg = (Message)m.invoke(this, message);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return msg;
}
這是基類中的方法,基類實(shí)現(xiàn)了接口中的execute方法,子類繼承父類,并添加具體的業(yè)務(wù)方法和代碼
3、一個(gè)具體的handler類示例
@CodeAnnotation(code = "10000001")
public Message method(Message message) {
System.out.println(message.getUserId());
//TODO:
return null;
}
上面的代碼,基本上手工的完成了命令碼和方法的映射,個(gè)人對(duì)Spring還不是很精通,不知道Spring有沒有完成現(xiàn)成的功能,不想重復(fù)早輪子。希望大俠們可以留言告之。