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
  • 相关阅读:
    Benelux Algorithm Programming Contest 2016 Preliminary K. Translators’ Dinner(思路)
    Benelux Algorithm Programming Contest 2016 Preliminary Target Practice
    Benelux Algorithm Programming Contest 2016 Preliminary I. Rock Band
    Benelux Algorithm Programming Contest 2016 Preliminary A. Block Game
    ICPC Northeastern European Regional Contest 2019 Apprentice Learning Trajectory
    ICPC Northeastern European Regional Contest 2019 Key Storage
    2018 ACM ICPC Asia Regional
    2018 ACM ICPC Asia Regional
    Mybatis入库出现异常后,如何捕捉异常
    优雅停止 SpringBoot 服务,拒绝 kill -9 暴力停止
  • 原文地址:https://www.cnblogs.com/LOVE0612/p/5231269.html
Copyright © 2011-2022 走看看