日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

[Java]Annotation元数据的几个应用

發布時間:2024/4/17 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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元数据的几个应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。