[Java]Annotation元数据的几个应用
生活随笔
收集整理的這篇文章主要介紹了
[Java]Annotation元数据的几个应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
Tiger出籠以后, Annotation成了一個小小的亮點,雖然有抄襲.net之嫌疑,畢竟讓Java開發者方便了許多。EJB3.0和Hibernate Annotation版都是基于這個東西了。下面是結合Spring的自動Log/鑒權/國際化應用:
public?interface?SessionService?extends?Service?{
????@Anonymous?//允許未登錄用戶調用
????@OperationLog?//自動log
????@Name(zh?=?"登錄")
????public?String?login(
????????????@Name(en="user",zh?=?"用戶")String?user,?
????????????@OperationLog(false)String?password);?//不log密碼
????@OperationLog
????@Name(zh="注銷")
????public?void?logout();
@Anonymous用于鑒權,允許匿名訪問。通過ThreadLocal的變量保存當前用戶的Session信息。
@OperationLog 用于標記是否自動Log, 可以作用于類、方法、參數
@Name用于i18n國際化支持。Java里面常見的國際化解決方法是.properties文件,個人認為這個方案不好,適合大型項目開發。小項目中這個標記一下足矣。如果要添加一種語言,只要在@Name中多一個參數,利用Eclipse的reference很容易知道有哪些地方要翻譯。
同樣@Name還可以加在Bean上,自動構造多語言的Table/List,方便之極。
@Name(zh="安全事件",en="Security?Event")
public?class?SecurityEvent?extends?AbstractEmsEvent{
????String?cause;
????@Name(zh="原因")
????public?String?getCause()?{
????????return?cause;
????}
????
}
附上我的I18nUtil工具類:
/**//**
?*?@author?steeven
?*/
public?class?I18nUtil?{
????public?static?String?getName(Method?method)?{
????????return?getI18n(method,Name.class);
????}
????public?static?String?getTip(Method?method)?{
????????return?getI18n(method,Tip.class);
????}
????public?static?String?getI18n(Method?method,Class<??extends?Annotation>?i18nClass)?{
????????Annotation?i18n?=?method.getAnnotation(i18nClass);
????????return?getProperty(i18n,method.getName());
????}
????
????public?static?String?getProperty(Annotation?i18n,?String?defaultValue)?{
????????if?(i18n==null)
????????????return?defaultValue;
????????Class<??extends?Annotation>?clz?=?i18n.annotationType();
????????try?{
????????????Method?method?=?clz.getMethod(getI18nMethodName());
????????????assert?method!=null;
????????????String?r?=?(String)?method.invoke(i18n);
????????????return?r==null?||?r.length()==0?defaultValue:r;
????????}?catch?(Exception?e)?{
????????????assert?false;
????????????return?defaultValue;
????????}
????}
????
????private?static?String?getI18nMethodName()?{
????????return?Locale.getDefault().getLanguage();
????}
????
????@SuppressWarnings("unchecked")
????public?static?<T?extends?Annotation>?T?getAnnotation(Annotation[]?argAnnotations,?Class<T>?clz)?{
????????for(Annotation?anno:argAnnotations)
????????????if?(clz.isInstance(anno))
????????????????return?(T)?anno;
????????return?null;
????}
}
元數據的結構似乎有些簡單,有時候要加很多@Name,@Tip,@Help好像沒辦法一個Tag搞定。
另外,還可以通過Annotation加上驗證、輸入界面描述,等等。程序很容易自動化,再多的畫面也用不了多少代碼。
Jdk5.0提供了這么好用的原數據機制,你有什么好的用法呢?
轉載于:https://www.cnblogs.com/steeven/archive/2005/07/28/201684.html
總結
以上是生活随笔為你收集整理的[Java]Annotation元数据的几个应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UML 中各种图形重要性的排行
- 下一篇: 非常有趣的古越及吴语-台州话