zoukankan      html  css  js  c++  java
  • Java之注解

    1. 介绍

            定义:注解(Annotation),也叫元数据。一种代码级别的说明。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。注解是以‘@注解名’在代码中存在的,我们可以通过反射机制编程实现对这些元数据的访问。

    2. 准备

            请先学习Java之反射机制的内容。

    3. 入门学习

            (1)定义一个注解 

    package com.annotation.define;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    //用来描述一个Class的属性对应数据库中的哪个字段
    public @interface DBColumn {
        public String columnName() default "";
    }

            @Target可以取值为:

                1.CONSTRUCTOR:用于描述构造器。

                2.FIELD:用于描述域(属性)。

                3.LOCAL_VARIABLE:用于描述局部变量。

                4.METHOD:用于描述方法。

                5.PACKAGE:用于描述包。

                6.PARAMETER:用于描述参数。

                7.TYPE:用于描述类、接口(包括注解类型) 或enum声明。

            @Retention定义了该Annotation的生命周期,取值(RetentionPoicy)有:

        1.SOURCE:在源文件中有效(即源文件保留)

        2.CLASS:在class文件中有效(即class保留)

        3.RUNTIME:在运行时有效(即运行时保留)

            @Documented用于描述其类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

            (2)使用注解

            在上面的代码中,我们定义了一个注解,但是如果我们不使用它它也就没有任何意义。

    package com.annotation.bean;
    
    import com.annotation.define.DBColumn;
    
    public class UserInfo {
        @DBColumn(columnName="LoginName")
        private String loginName;
        @DBColumn(columnName="UserName")
        private String userName;
        @DBColumn(columnName="PassWord")
        private String passWord;
    }

            我们用@DBColumn注解来标注loginName对应数据库中的LoginName字段,userName对应数据库中的UserName字段,passWord对应数据库中的PassWord字段。

    package com.annotation;
    
    import java.lang.reflect.Field;
    
    import com.annotation.bean.UserInfo;
    import com.annotation.define.DBColumn;
    
    public class TestMain {
    
        public static void main(String[] args) {
            Field[] fields = UserInfo.class.getDeclaredFields();
            for (Field field: fields) {
                if (field.isAnnotationPresent(DBColumn.class)) {
                    String fieldName = ((DBColumn)field.getAnnotation(DBColumn.class)).columnName();
                    System.out.println(field.getName()+"对应数据库字段为"+fieldName);
                }
            }
        }
    }

            打印结果为:

    loginName对应数据库字段为LoginName
    userName对应数据库字段为UserName
    passWord对应数据库字段为PassWord

    4. 结语

            大部分人会觉得,在上面的例子中,好像没有什么实际应用的意义。但是稍微想一下:如果实际应用中,一个JavaBean对应数据库中的一个表,而一个bean的属性对应一个字段的话(理想情况下),当我们想把一个JavaBean保存到数据库中,那么我们就可以利用注解另辟蹊径。比如:我们在类名称上注解对应其在数据库的表名,在类属性上注解其对应表的字段名,那么我们就可以根据JavaBean的元数据动态的生成相应的INSERT、UPDATE、DELETE语句等等,而不用在为不同的JavaBean保存而手工写不同的SQL语句,这样会大大减少我们的工作量。

            另外,基于注解的MVC大部分也是这种思想。

    笔者只是初学者,开此博客的初衷是为了给自己的学习过程留一个痕迹。所以您可能发现笔者措辞不严谨、逻辑不合理,甚至代码有错误、结论很偏颇等等。笔者感激各位的讨论和指正,并在此不胜感激!拜谢!欢迎加QQ群讨论:852410026
  • 相关阅读:
    django之上传
    djano的ORM操作
    Python中的分页管理
    MySQL作业
    socket操作
    python的os模块
    django-debug-toolbar的配置及使用
    logging模板及配置说明
    使用StrictRedis连接操作有序集合
    学习总结
  • 原文地址:https://www.cnblogs.com/LOVE0612/p/5231269.html
Copyright © 2011-2022 走看看