java annotation注解进修,自定义注解

    添加时间:2013-7-30 点击量:

    1Annotation(注解介绍


    Annotation(注解JDK5.0及今后版本引入的。它可以用于创建文档,跟踪代码中的依附性,甚至履行根蒂根基编译时搜检。注解是以注解名在代码中存在的,按照注解参数的个数,我们可以将注解分为:标识表记标帜注解、单值注解、完全注解三类。它们都不会直接影响到法度的语义,只是作为注解(标识)存在,我们可以经由过程反射机制编程实现对这些元数据(用来描述数据的数据)的接见。别的,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件中呈现。


    javaEE经典的SSH框架中(StrtusSpringhibernate),都可以用过应用注解来削减设备,进步体系的灵活性,所以,进修注解,是很有须要的一件事。


    2Annotation进修


    元注解


    元注解也就是注解的注解,Java中供给了四种元注解,专门负责注解其他的注解,分别如下:


    @Retention元注解,默示须要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包含:
    RetentionPolicy.SOURCE:
    逗留在java源文件,编译器被丢掉
    RetentionPolicy.CLASS
    :逗留在class文件中,但会被VM丢弃(默认)
    RetentionPolicy.RUNTIME
    :内存中的字节码,VM将在运行时也保存注解,是以可以经由过程反射机制读取注解的信息


    @Target说了然Annotation所润饰的对象局限:Annotation可被用于 packagestypes(类、接口、列举、Annotation类型)、类型成员(办法、机关办法、成员变量、列举值)、办法参数和本地变量(如轮回变量、catch参数)。在Annotation类型的声明中应用了target可加倍明晰其润饰的目标。
    ElementType.CTRUCTOR:
    机关器声明
    ElementType.FIELD:
    成员变量、对象、属性(包含enum实例)
    ElementType.LOCAL_VARIABLE:
    局部变量声明
    ElementType.METHOD:
    办法声明
    ElementType.PACKAGE:
    包声明
    ElementType.PARAMETER:
    参数声明
    ElementType.TYPE:
    类、接口(包含注解类型enum声明


    @Documented将注解包含在JavaDoc


    @Inheried容许子类持续父类中的注解


    3、自定义注解


    下面写一个自定义的注解,不评论辩论他的实用性,只是进修注解的写法以及应用


    一个列举,为注解做数据筹办:


    package timeng.annotation;


    /




    〈正则表达式规矩列举〉


    @author
    timeng


    /


    public
    enum RegexRule {



    /


    email正則表達式規則


    /



    EMAIL^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}¥),



    /


    數字正則表達式規則


    /



    NUMBER^[0-9]¥);



     



    public String value;



     


    RegexRule(String value) {



    this.value = value;


    }


    }


    定义注解格局:public @interface 注解名 {定义体}


    注解参数的可支撑数据类型:


    1.所有根蒂根基数据类型(int,float,boolean,byte,double,char,long,short)
    2.String
    类型
    3.Class
    类型
    4.enum
    类型
    5.Annotation
    类型
    6.
    以上所有类型的数组


    注解:


    package timeng.annotation;



     


    /




    〈正则表达式注解〉


    @author
    timeng


    /


    @Documented


    @Retention(RetentionPolicy.RUNTIME


    @Target(ElementType.METHOD


    Inherited


    public
    @interface
    Regex {



    /


    正则表达式


    @return


    /


    RegexRule regexRule() default RegexRule.NUMBER;


    }


    注解解析类,很是关键


    package timeng.annotationparse;



     


    /




    〈注解解析通用類〉




    @author
    timeng


    /


    public
    class AnnotationParseUtil {



    public
    void parseMethod(Class clazz) throws IllegalArgumentException, IllegalAccessException,


    InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException {


    Object obj = clazz.getConstructor(new Class[] {}).newInstance(new Object[] {});



    for (Method method : clazz.getDeclaredMethods()) {



    DateFormat df = method.getAnnotation(DateFormat.class);


    String name = ;



    if (df != null) {


    name = df.dateType().value;


    method.invoke(obj, name);


    }


    }


    }



    /




    功能描述: <br>


    〈调用指定类的指定办法,传参〉


    /



    public
    void parseMethod(Object proxy, Method method, Object[] args) throws IllegalArgumentException,


    IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException,


    InstantiationException {



    // Object obj = clazz.getConstructor(new Class[] {}).newInstance(new Object[] {});



    Regex df = method.getAnnotation(Regex.class);


    String name = ;



    if (df != null) {


    name = df.regexRule().value;


    method.invoke(proxy, args[0], name);


    }


    }


    }



     


    应用注解的类


    package timeng.test;



     


    /




    〈用例〉




    @author
    timeng


    /


    public
    class UseCase {



    /


    @DateFormat(dateType=DateType.DateOnly) public void formatDate(Date date,String type){ System.out.println(date);


    }


    /



    @Regex(regexRule = RegexRule.EMAIL



    public
    void regexEmail(String unCheckedString, String regexRule) {



    boolean rs = Pattern.compile(regexRule).matcher(unCheckedString).find();



    // System.out.println(unCheckedString);



    // System.out.println(regexRule);


    System.out.println(rs);


    }


    }


    测试类


    package timeng.test;



     


    /




    〈测试类〉




    @author
    timeng


    /


    public
    class Test {



    public
    static
    void main(String[] args) throws IllegalArgumentException, IllegalAccessException,


    InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException {


    AnnotationParseUtil parse = new AnnotationParseUtil();



    // parse.parseMethod(UseCase.class);


    Object[] params = new Object[10];


    params[0] = 123@qq.com;


    UseCase useCase = new UseCase();


    parse.parseMethod(useCase, UseCase.class.getDeclaredMethods()[0], params);


    }


    }



     


    运行test类即可看到结果:Test类应用注解,来添加正则表达式的验证规矩,本例验证了一个邮箱格局。

    原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#
    分享到: