注解就是贴标签

(1)注解的作用

1,生成文档。如常用的@param

2,跟踪代码依赖性,实现替代文件的功能。在spring中,主要是减少配置。

3,编译时进行格式检查。如常用的@override

(2)注解的分类

1)按照运行机制划分:
【源码注解→编译时注解→运行时注解】

源码注解:只在源码中存在,编译成.class文件就不存在了。

编译时注解:在源码和.class文件中都存在。像前面的@Override、@Deprecated、@SuppressWarnings,他们都属于编译时注解。

运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解。像@Autowired自动注入的这样一种注解就属于运行时注解,它会在程序运行的时候把你的成员变量自动的注入进来。

2)按照来源划分:
【来自JDK的注解——来自第三方的注解——自定义注解】

3)元注解:
元注解是给注解进行注解,可以理解为注解的注解就是元注解。

(3)java中常见的注解

1,JDK的注解

@override标记该方法为覆盖方法

@Deprecated标记该方法已经过时

@SuppressWarning()表示忽略警告

2,java第三方注解

Spring的注解

@Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作

@Service用于标注业务层组件

@Controller用于标注控制层组件(如struts中的action)

@Repository用于标注数据访问组件,即DAO组件

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

Mybatis的注解

@InserProvider 注解为增加

@UpdateProvider 注解为更新

@Options设置缓存时间

Ps:常用增删改查:@InsertProvider,@DeleteProvider@UpdateProvider和@SelectProvider

3,元注解

四个元注解分别是:

@Target

@Retention,

@Documented,

@Inherited

元注解是java API提供,是专门用来定义注解的注解,其作用分别如下:

@Target 表示该注解用于什么地方,可能的值在枚举类
ElemenetType 中,包括:

ElemenetType.CONSTRUCTOR----------------------------构造器声明

ElemenetType.FIELD
--------------------------------------域声明(包括 enum 实例)

ElemenetType.LOCAL_VARIABLE-------------------------
局部变量声明

ElemenetType.METHOD
----------------------------------方法声明

ElemenetType.PACKAGE
--------------------------------- 包声明

ElemenetType.PARAMETER
------------------------------参数声明

ElemenetType.TYPE---------------------------------------
类,接口(包括注解类型)或enum声明

@Retention 表示在什么级别保存该注解信息。可选的参数值在枚举类型 RetentionPolicy 中,包括:

RetentionPolicy.SOURCE
---------------------------------注解将被编译器丢弃

RetentionPolicy.CLASS
-----------------------------------注解在class文件中可用,但会被VM丢弃

RetentionPolicy.RUNTIME VM-------将在运行期也保留注释,因此可以通过反射机制读取注解的信息。

@Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@see,@param 等。

@Inherited 允许子类继承父类中的注解。

4,自定义注解

例子:

定义:

@Target({ElementType.METHOD,ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Inherited

@Documented public
@interface Description {

String desc();

String author();

int age() default 18;

}

测试:

@Description(desc="i
am Color",author="boy",age=18)

public
String Color() {

return "red";

}

因为我们前面定义的作用域是在方法和类接口上,所以这个注解在Color()方法上使用是没问题的

使用自定义注解:
使用注解的语法:
@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,...)
案例:

@Description(desc="i
am Color",author="boy",age=18)

public
String Color() {

return "red";

}

这里的Description是我们刚才在自定义注解语法要求里面定义的注解噢,然后我们可以给它的每一个成员变量赋值,注意数据类型。值得注意的是,因为我们前面定义的作用域是在方法和类接口上,所以这个注解在Color()方法上使用是没问题的。

解析注解
概念:
通过反射获取类 、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。

实例:

1、创建@Table注解

package person.lb.annotation;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

 * 表名

 * @author nobounds

 *

 */

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

public @interface Table {

    String value() default "";

}

2、创建@Column注解:

package person.lb.annotation;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

 * 字段

 * @author nobounds

 *

 */

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface Column {

    String name() default "";

    String dataType() default "varchar(20)";

    String comment() default "";

}

3、创建实体类Users:

package person.lb.annotation;

@Table("users")

public class Users {

    @Column(name="ID", dataType="int")

    private int id;

    @Column(comment="用户名")

    private String userName;

    @Column(name="pwd", comment="密码")

    private String password;

    @Column(dataType="varchar(25)", comment="邮箱")

    private String email;

    public String getUserName() {

        return userName;

    }

    public void setUserName(String userName) {

        this.userName = userName;

    }

    public String getPassword() {

        return password;

    }

    public void setPassword(String password) {

        this.password = password;

    }

    public String getEmail() {

        return email;

    }

    public void setEmail(String email) {

        this.email = email;

    }

}

4、创建注解处理器AnnotationHandler:

package person.lb.annotation;

import java.lang.annotation.Annotation;

import java.lang.reflect.Field;

public class AnnotationHandler {

    public static void main(String[] args) {

        StringBuilder sql = new StringBuilder("CREATE TABLE ");

        try {

            Class clazz = Class.forName("person.lb.annotation.Users");

            //获取Users类上的Table注解

            Table tableAnnotation = (Table) clazz.getAnnotation(Table.class);

            //获取表名

            String tableName = tableAnnotation.value().toUpperCase();

            if("".equals(tableName)) {

                tableName = clazz.getName().toUpperCase();

            }

            sql.append(tableName);

            sql.append(" ( \n");

            //获取类中的所有字段

            Field[] fields = clazz.getDeclaredFields();

            for(Field field : fields) {

                //获取字段上的所有注解

                Annotation[] fieldAnnotations = field.getAnnotations();

                if(fieldAnnotations.length > 0) {

                    //遍历注解

                    for(Annotation fieldAnnotation : fieldAnnotations) {

                        //如果是@Field注解,那么进行处理

                        if(fieldAnnotation instanceof Column) {

                            //获取字段名

                            String columnName = ((Column) fieldAnnotation).name().toUpperCase();

                            if("".equals(columnName)) {

                                columnName = field.getName().toUpperCase();

                            }

                            //获取数据类型

                            String dataType = ((Column) fieldAnnotation).dataType().toUpperCase();

                            //获取注释

                            String comment = ((Column) fieldAnnotation).comment();

                            if("".equals(comment)) {

                                sql.append(columnName + "\t" + dataType + ",\n");

                            } else {

                                sql.append(columnName + "\t" + dataType + " COMMENT '" + comment + "',\n");

                            }

                        }

                    }

                }

            }

            sql.append(" ) ");

            System.out.println("生成的sql语句为:\n" + sql.toString());

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

    }

}

  

结果:

生成的sql语句为:
CREATE TABLE USERS (
ID INT,
USERNAME VARCHAR(20) COMMENT '用户名',
PWD VARCHAR(20) COMMENT '密码',
EMAIL VARCHAR(25) COMMENT '邮箱',
)

  

java注解的实质,何为注解的更多相关文章

  1. 【lombok】lombok---帮你简化生成必要但臃肿的java代码工具 【映射注解和lombok注解同时使用 以及 映射注解放在属性和get方法上的区别】

    官方地址:https://projectlombok.org/ GitHub:https://github.com/rzwitserloot/lombok 指导说明文档:http://jnb.ociw ...

  2. java深入技术九 (注解)

    java注解 (Annotation) 一般起到说明,配置的作用,在java.lang.annotation 定义,本质上没有增强java的能力 1.常用注解:@Override,强制编译器检查标注的 ...

  3. Java 基础【11】@注解

    1.注解简介 JDK 1.5 中引入的 java.lang.annotation 包提供注解编程支持,可以让类在编译.类加载.运行时被读取,并执行相应的处理. 在 Java EE应用的时候,总是免不了 ...

  4. 深入理解Java:注解(Annotation)--注解处理器

    如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...

  5. 黑马程序员——【Java高新技术】——JavaBean、注解

    ---------- android培训.java培训.期待与您交流! ---------- 一.JavaBean * 通过内省引入JavaBean:内省对应的英文全程是IntroSpector.在J ...

  6. Java从零开始学四十七(注解简述)

    一.Java中注解Annotation 什么是注解:用来描述数据的数据(元数据). Java代码里的特殊标记.它为代码中添加用Java程序无法表达的额外信息提供一种形式化的方法,使用我们可以在未来的某 ...

  7. Java注解教程:自定义注解示例,利用反射进行解析

    Java注解能够提供代码的相关信息,同时对于所注解的代码结构又没有直接影响.在这篇教程中,我们将学习Java注解,如何编写自定义注解,注解的使用,以及如何使用反射解析注解. 注解是Java 1.5引入 ...

  8. Java注解教程及自定义注解

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  9. 【JAVA - 基础】之Annotation注解浅析

    注解在JAVA中,尤其是一些ORM框架(如Hibernate等)中是比较常用的一种机制. 注解是JAVA 1.5之后引入的新功能,正确来说是反射的一部分,没有反射,注解也就无法正常使用.注解可以理解成 ...

随机推荐

  1. php7 curl返回false error返回空串

    php7 CURLOPT_SSL_VERIFYPEER 禁用后cURL将终止从服务端进行验证.使用CURLOPT_CAINFO选项设置证书使用CURLOPT_CAPATH选项设置证书目录 如果CURL ...

  2. linux 下导出oracle数据库

    #变更用户su - oracle <<EOF#添加用户名/密码,目标文件地址和文件名 ,保存记录日志地址/文件名  full=y表示数据库全部导出,默认导出连接数据库的用户数据库对象 ex ...

  3. vue 自定义组件销毁

    今天在开发电商vue前端项目时,用户每次登出再换其它用户登录时,页面显示的用户名和左则导航都还是上个用户的,刚开始以为是localStorage中没有清除全局数据,然后在用户点击退出系统时手动清除lo ...

  4. Linux 内核态 用户态

    内核态和用户态最主要区别在于权限不同,比如特权级别0-3,0级就意味着进入内核态,分级别之后,应该程序大部分情况下运行在用户态,保证了程序运行的安全性 什么情况下会发生从用户态向内核态切换.这里细分为 ...

  5. 网址导航19A

    [导航] KIM主页 265导航 好866 [名站] 百度 网易 腾讯 新华 中新 凤凰 [新闻] 联合早报  南方周末  澎湃新闻 [系统] 宋永志 蒲公英 技术员 装机网 系统之家 [软件] 星愿 ...

  6. HTML5新规范和CSS3新特性

    1.HTML5最新规范(HTML5是HTML.XHTML以及HTML.DOM的新标准) ①用于绘画canvas元素 ②用于媒介回放的video和audio元素 ③对本地离线存储的更好支持 ④新的特俗内 ...

  7. weblogic中配置数据源

    Weblogic数据源配置 一.配置数据源 1.点击数据源,进入数据源配置页面,点击新建后选择一般数据源 2.输入名称和jndi名称(两个输入一样即可)后点击下一步 3.选择驱动后点击下一步 4.输入 ...

  8. Chrome自定义滚动条

    /*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar { width: 16px; height: 16px; background-color: #F5 ...

  9. android shape 怎么在底部画横线

    使用layer-list可以,画了两层 1 2 3 4 5 6 7 8 9         <layer-list>             <!-- This is the lin ...

  10. dom4j移除节点不成功

    在使用dom4j的时候想移除xml节点,经常使用remove来移除节点,通过整个文档或者根节点删除某一个子节点,但如果子节点不是儿子节点,在dom4j中就无法删除.在dom4j中移除节点必须使用父节点 ...