相对于注释这种给程序员看的信息;

注解,就是给程序看的解释性的语言,其作用就相当于配置文件的存在。其存在的意义在于以下几点:

优点:

  • 方便的使程序员看到相关项的关联位置及关联方式等信息。

    缺点:

  • 由于注解是存在于程序之上的,所以每次对注解进行修改后就必须要对源代码进行重新编译才会生效。


注解都长什么样呢?


在使用Eclipse编程的时候我们会经常看到下面几种:

  • @Override——覆盖父类的方法
  • @SupportWarning——抑制警告
  • @Deprecated——过时的

    大致的使用方法,我从网上download下来一幅图片,基本上可以讲述这些常用的注解的作用及使用方式。如下:



    但是光有自带的这些注解可是远远不够滴。我们还需要开发出自定义的实现相关需求的注解。这样才能应付复杂的实际的开发环境。

怎么开发自定义注解?


开发一个自定义注解并不是很复杂,只要按照一定的约束和规范,就可以实现自定义的注解的开发。实现的步骤如下:

  • 使用@interface关键字修饰注解名称
  • 声明符合要求的属性及字段
  • 使用元注解对自定义的注解进行约束和规范(尤其需要使用@Retention,来约束自定义注解的有效的Scope,一般是RetentionPolicy.RUNTIME这样我们才可以在代码编译完成及运行的时候捕捉到注解上面存在的数据信息)。

对于元注解一般有如下的几个:

- @Retention:可以通俗的理解为注解持有的域的范围

- @Target:理解为注解存在的位置

- @Document:加上这个注解的注解就会被收录到Javadoc工具上

- @Inherited:加上这个注解就会使得自定义的注解可以被继承

上面的元注解中最为常用也最为重要的是@Retention和@Target两个圆元注解,同样在网上下载了一张图,可以很好地解释相关项的含义及作用。


使用注解开发出一个数据库连接小助手注解


首先我们需要明白的是数据库连接需要的是驱动,资源定位,用户名和密码四个“属性”,所以我们的自定义注解就需要有这四个属性。如下:

package annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//这里是最为关键的一点,尤其需要注意注解的存在域的范围
@Retention(RetentionPolicy.RUNTIME)
public @interface JdbcAnnotation {

    String driver();
    String url();
    String username();
    String password();

}

然后我们就可以在程序中引用自定义的注解了。如下:

package annotation;

import java.lang.reflect.Method;
import java.sql.Connection;

import org.junit.Test;

public class JDBCUtils {

    @JdbcAnnotation(driver="com.mysql.jdbc.Driver",url="jdbc:mysql://localhost:3306/myDb",username="root",password="mysql")
    public static Connection getConnection() throws Exception {
        Method method = JDBCUtils.class.getDeclaredMethod("getConnection", null);
        JdbcAnnotation ja = method.getAnnotation(JdbcAnnotation.class);
        String driver = ja.driver();
        String url = ja.url();
        String username = ja.username();
        String password = ja.password();

        System.out.println("数据库连接驱动:"+driver);
        System.out.println("数据库连接资源定位:"+url);
        System.out.println("数据库连接用户名:"+username);
        System.out.println("数据库连接密码:"+password);
        return null;
    }

    @Test
    public void test() throws Exception {
        getConnection();
    }

}

实现的原理是:使用反射技术,获取注解信息,然后解析注解的内容并用相关的变量进行保存,然后就可以被其他的代码得到运用。比如调用实际开发中的数据库连接帮助类的相关方法,实现相关的业务逻辑。在这里仅仅是为了显示可以从注解上获得我们想要的信息,即可。


程序的运行结果如下所示:

数据库连接驱动:com.mysql.jdbc.Driver
数据库连接资源定位:jdbc:mysql://localhost:3306/myDb
数据库连接用户名:root
数据库连接密码:mysql

总结


使用自定义的注解技术,我们可以简化开发过程中来回切换任务,也可以较好的对代码进行相关项的维护,方便的处理业务逻辑。但是不容置疑的是其做完修改后要对源代码进行编译,这在一定程度上限制了注解的使用。

Java --Annotation学习心得体会及笔记的更多相关文章

  1. Java开发学习心得(二):Mybatis和Url路由

    目录 Java开发学习心得(二):Mybatis和Url路由 1.3 Mybatis 2 URL路由 2.1 @RequestMapping 2.2 @PathVariable 2.3 不同的请求类型 ...

  2. Java开发学习心得(一):SSM环境搭建

    目录 Java开发学习心得(一):SSM环境搭建 1 SSM框架 1.1 Spring Framework 1.2 Spring MVC Java开发学习心得(一):SSM环境搭建 有一点.NET的开 ...

  3. Salty Fish 结对学习心得体会及创意照 (20165211 20165208)

    小组结对学习心得体会及创意照 在阅读了软件工程讲义 3 两人合作(2) 要会做汉堡包和现代软件工程讲义 3 结对编程和两人合作后,加之对于这几周组队学习的感悟,我们对于组队学习的一些感悟和想法如下: ...

  4. 微信小程序js学习心得体会

    微信小程序js学习心得体会 页面控制的bindtap和catchtap 用法,区别 <button id='123' data-userDate='100' bindtap='tabMessag ...

  5. java集合类学习心得

    java集合类学习心得 看了java从入门到精通的第十章,做个总结,图片均取自网络. 常用集合的继承关系 Linked 改快读慢 Array 读快改慢 Hash 两都之间 Collection是集合接 ...

  6. Java基础学习心得笔记

    对于很多只会C语言的初学者而言,面对java基础语法学习,反而感觉很难,其实其中最大的问题不是语法难,而是一种编程思想的转变.面向过程就是把你的代码封装成函数,然后依次去做一件事情,面向过程是把你要做 ...

  7. Java开发学习心得(三):项目结构

    [TOC] 3 项目结构 经过前面一系列学习,差不多对Java的开发过程有了一定的了解,为了能保持一个良好的项目结构,考虑到接下来要进行开发,还需要学习一下Java的项目结构 下面以两个项目结构为参照 ...

  8. java自学入门心得体会 0.1

    之前记录了java的简介和基本语法 这里记载下对象和类 不太懂的我理解java对象和类的概念很模糊,因为有了 Abstract修饰符 让对象与类更加的扑朔迷离 - - 所以,就像很开放的语言,创建对象 ...

  9. 关于C#的学习心得体会

    1·多看多写 多看网上成熟的demo,养成一个良好的代码编写习惯,将终生受益 2·多编多敲 看了代码,理解demo中的思路,灵活运用到自己的代码中,这样不仅了解了别人的代码,同时还了解了代码的执行过程 ...

随机推荐

  1. Java多线程基础总结

    一.线程和进程关系 二.创建方式1.继承Thread类,重写run方法2.实现Runable接口,重写run方法3.使用匿名内部类 三.API接口start()currentThread() 获取当前 ...

  2. windows server 2008 R2 禁用ipv6和隧道适配器

    在windows server 2008 R2操作系统下部署weblogic web application,部署完成后进行测试,发现测试页的地址使用的是隧道适配器的地址,而不是静态的ip地址,而且所 ...

  3. Quartz + Tablesaw 报表统计

    场景 在12 月份做的报表功能中,直接从 ES 查询一个月的数据.当数据量特别大时,查询速度会非常缓慢甚至查询失败.解决方案是使用定时任务,在每天凌晨指定时间自动查询前一天的数据,然后写入 CSV 文 ...

  4. 在移动端画出真正的1px边框

    一.问题    写H5的样式时候,设置元素的边框为1px,不幸的事情在IOS设备上发生了,设计师会说,咦,边框怎么那么大,这是2px了吧?改成1px.我明明设置成1px了啊. 二.为什么边框变粗了? ...

  5. Spring-cloud (七)自定义HystrixCommand

    前提 1.在继续学习Hystrix之前,向关注本人博客的各位致歉 由于之前的项目起名以及服务之间的名称不是很规范,所以我修改了这些名称方便后来的代码管理,这些代码可以在本人github中找到,这里贴出 ...

  6. Docker常见仓库Redis

    Redis 基本信息 Redis 是开源的内存 Key-Value 数据库实现. 该仓库提供了 Redis 2.6 ~ 2.8.9 各个版本的镜像. 使用方法 默认会在 6379 端口启动数据库. $ ...

  7. 计算机网络之域名系统DNS

    域名系统DNS 域名系统DNS(Domai NameSystem)是因特网使用的命名系统,用于把便于人们使用的机器名字转换为IP地址. 许多应用层软件经常直接使用域名系统,但计算机的用户只是间接而不是 ...

  8. Thread Pools

    许多程序会动态创建数十个设置上百个线程.举个例子,一个web服务器可能在每一个新到来的请求时创建一个新线程,然后在请求完成后将其终止. 然而,创建一个新线程将会带来一定的耗费:它需要在内核中创建自身必 ...

  9. ubuntu蓝牙音响配对成功但在声音设置中无法设置 解决

    ubuntu蓝牙音响配对成功但在声音设置中无法设置 解决 首先,连接蓝牙 但是,在声音设置中如下: 都没有发现设备??? 打开终端输入: ~$ pactl load-module module-blu ...

  10. Unity UGUI实现分段式血条

    我们可以看到像英雄联盟等游戏里英雄头顶的血条显示并非是纯色的,而是根据血量的多少而显示一定量的格子,这种方式明显是比较友好.比较美观的,事实上我们的游戏里面也想实现这样的效果,那该怎么办呢?根据血量的 ...