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元数据的几个应用相关推荐

  1. Java Annotation(注解)使用教程

    Java Annotation(注解)使用教程 1 什么是注解 2 注解的使用语法 2.1 内置注解介绍以及使用 @Override @Deprecated @SuppressWarnings @Sa ...

  2. Java Annotation手册

    版权声明:本文可以自由转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明 作者:cleverpig(作者的Blog: http://blog.matrix.org.cn/page/cle ...

  3. JAVA的元数据注释

    JAVA元数据注释初探 JAVA的元数据功能是JDK1.5才开始支持的,以前都没有,正因为是新支持的,所以有关于它的介绍挺少,用处也不太多,最近发现很多框架都可以把它用来配置一些东西,以代替以前比较复 ...

  4. Java Annotation Processing 概述

    文章目录 JAVA ANNOTATION PROCESSING 引言 代码实现 annotation-processor 实现一个 `Processor` 创建 `AbstractProcessor` ...

  5. Error:java: Annotation processing is not supported for module cycles. Please ensure that all modules

    Error:java: Annotation processing is not supported for module cycles. Please ensure that all modules ...

  6. Java Annotation的RetentionPolicy介绍

    Java Annotation对应的Retention有3种,在RetentionPolicy中定义,有3种: SOURCE. 注解保留在源代码中,但是编译的时候会被编译器所丢弃.比如@Overrid ...

  7. Java Annotation

    为什么80%的码农都做不了架构师?>>>    第1部分 Annotation架构 先看看Annotation的架构图: 从中,我们可以看出: (01) 1个Annotation 和 ...

  8. java annotation应用_Java Annotation高级应用

    前言: 在此行文<java annotation高级应用>,具体实例化解释annotation和annotation processing tool(APT)的使用.望能对各位的有所帮助. ...

  9. Java Annotation认知(包括框架图、详细介绍、示例说明)

    摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...

最新文章

  1. 团队作业5-测试与发布(AIpha版本)
  2. 一些解密必备知识(2)- 基础篇03|解密系列
  3. 040_Unicode对照表六
  4. python基本输入输出函数有_新手学Python,输入输出函数、赋值语句常见5个错误,弄懂即过关...
  5. C语言——找出矩阵最大值
  6. 【C语言】判断学生成绩等级
  7. git push 报错git: push-u is not a git command. See 'git --help'.
  8. It#39;s about trust
  9. Pygame实现”走四棋儿“双人对战小游戏
  10. 心灵鸡汤——人生哲理
  11. [除一波并查集和贪心的草]
  12. 【数据结构(C语言版)严蔚敏 第一章 绪论】
  13. 洛谷 P1035 级数求和【二分||枚举】
  14. EMC设计经典15问
  15. android手机只有三星采用实体键,三星新配件:你终于可以体面地使用实体全键盘了...
  16. 计算机临床医学自动化哪个好,这五个专业待遇高,就业好,但是很难学,挂科风险大,选择要慎重...
  17. iastora怎么改成ahci_WIN7系统硬盘IDE模式转AHCI模式
  18. springboot整合redis报错org.springframework.beans.factory.UnsatisfiedDependencyException
  19. 获取移动端ip的方法
  20. vmware虚拟机实现两台电脑远程桌面连接

热门文章

  1. [NOTE] WindowsLinux常用环境变量
  2. OpenFoam2.4.0 cannot find input file: `contrib/dist/mofed/debian/changelog解决方案
  3. tf记录 之 tf.boolean_mask函数
  4. c++ primer 5th 习题11.14自己编写的答案
  5. go语言1.4版本将支持面向android开发,[翻译]Go语言1.4版本将支持面向Android开发
  6. python算程序员吗_我算是优秀的程序员吗?
  7. Java线程之守护线程(Daemon)
  8. 使用Maven管理Eclipse Java项目(多modules编译)
  9. linux 查看cpu和磁盘使用情况
  10. 信息安全风险评估实施