什么是注解?

  • 注解和接口,类属于同一个级别
  • 注解可以在变量、方法、类上加载
  • 注解可以有属性也可以没有属性
  • 注解是有作用范围(源码、编译期间,运行期间)
      • 源码期间:例如String类上@Author  @since  , 使用javac命令将当前源码生成帮助文件,可以识别String类上的注解
      • 编译期间:@Override 、@SuppressWarnings 、 @Deprecated,告诉编译器部分信息
      • 运行期间:@Test    Junit会运行包含@Test注解的方法

@Test(timeout=1000)  //单元测试,超过1ms则报异常

@Override  //重写父类的方法

@SuppressWarnings({ "rawtypes", "unused" }) //抑制编译器警告,如果有变量未使用,未遵循泛型格式错误不报警告

@Deprecated  //声明一下方法过时,不建议使用

@Retention(RetentionPolicy.RUNTIME)  //定义注解的时候,需要通过元注解说明当前自定义注解的作用,此注解在运行期间有效

@Target(ElementType.METHOD)  //定义注解的时候,需要通过@Target说明目标对象

注解的作用:

  • 编译检查
  • 配置
  • 生成帮助文档

什么时候用注解来做配置?

如果配置信息不会发生的修改,例如servlet路径,建议使用注解的形式

如果配置信息需要发生频繁的修改,例如数据库的用户名和密码信息,

建议采用传统方法 (.txt , .properties , .xml)

自定义注解

格式:

  • public @interface 注解名称{

    //在注解中定义一个属性
    public 属性类型 属性名称() default 默认值;

  • public long timeout() default -1;

    }

支持的类型:

注解支持的类型有:基本数据类型(4类8种),String,Class,Annotation,Enumeration,以及以上类型的一维数组类型

注解作用:配置

配置:开发的时候部分信息不希望写死在程序中,例如数据库的用户名和密码,可以将其存放在.txtr,properties,xml文件中

    注解在后期的作用主要做配置

框架开发中,一般提供两种方式:xml和注解

案例:模拟Junit

1 自定义注解@MyTest

  通过元注解声明作用域和目标对象,否则运行期间无法通过反射获取到注解信息

2 定义UserDao,里面有四个方法,加上注解

3 编写测试类进行测试

将UserDao.class文件通过反射加载到内存

获取到字节码文件上的所有方法

判断方法上是否有注解,如果有,则执行该方法。

MyTest

package com.test02;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; //定义注解的时候,需要通过元注解说明当前自定义注解的作用
//注解在运行期间有效
@Retention(RetentionPolicy.RUNTIME)
//定义注解的时候,需要通过@Target说明目标对象
@Target(ElementType.METHOD)
public @interface MyTest {
//在MyTest注解中定义成员属性,属性为-1
public long timeout() default -1;
}

UserDao

package com.test02;

public class UserDao {
static{
System.out.println("加载UserDao静态代码块");
} @MyTest
public void addUser(){
System.out.println("增加用户");
}
@MyTest
public void delUser(){
System.out.println("删除用户");
}
@MyTest
public void uptUser(){
System.out.println("更新用户");
}
@MyTest
public void getUser(){
System.out.println("得到用户");
}
}

测试类

package com.test02;

import java.lang.reflect.Method;

public class MyJunit {
public static void main(String[] args) throws Exception {
// 加载UserDao.class字节码文件中的方法,判断哪些方法上有自定义的注解@MyTest并执行
// 1 将UserDao.class字节码文件加载到内存,class对象(字节码文件在内存中的对象)
Class clazz = Class.forName("com.test02.UserDao");
// 2 获取字节码对象上所有的方法,数组中的每一个元素都代表method对象(相当于字节码中的每一个方法)
Method[] methods = clazz.getMethods();
// 遍历每个方法
for (Method method : methods) {
// System.out.println(method.getName());
// 判断方法上是否有@MyTest注解
// System.out.println(method.isAnnotationPresent(MyTest.class));
if (method.isAnnotationPresent(MyTest.class)) {
// 如果有@MyTest注解,执行,否则忽略
method.invoke(new UserDao());
}
} }
}

二十一 JDK注解&注解案例的更多相关文章

  1. java web学习总结(二十一) -------------------模拟Servlet3.0使用注解的方式配置Servlet

    一.Servlet的传统配置方式 在JavaWeb开发中, 每次编写一个Servlet都需要在web.xml文件中进行配置,如下所示: 1 <servlet> 2 <servlet- ...

  2. JPA学习(二、JPA_基本注解)

    框架学习之JPA(二) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 ...

  3. JDK中注解的底层实现

    前提 用Java快三年了,注解算是一个常用的类型,特别是在一些框架里面会大量使用注解做组件标识.配置或者策略.但是一直没有深入去探究JDK中的注解到底是什么,底层是怎么实现了?于是参考了一些资料,做了 ...

  4. 2017.2.13 开涛shiro教程-第十二章-与Spring集成(二)shiro权限注解

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第十二章-与Spring集成(二)shiro权限注解 shiro注 ...

  5. 阶段3 2.Spring_05.基于XML的IOC的案例1_4 注解IOC案例-把自己编写的类使用注解配置

    注解改造案例 复制之前的xml配置的pom.xml里面的依赖. 复制com文件 bean.xml配置文件也拷贝过来 测试类也复制过来 开始基于注解的IOC配置 右键项目,选择maven.选择更新 更新 ...

  6. 使用JDK开发WebServrice案例

    使用JDK开发WebServrice案例: 一.开发WebService服务器端 第一步:创建Java工程 ,创建相应的包(服务端)使用JDK开发(1.6以上版本) 第二步:建一个接口WebServi ...

  7. 【圣诞特献】Web 前端开发精华文章推荐【系列二十一】

    <Web 前端开发精华文章推荐>2013年第九期(总第二十一期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和  ...

  8. (C/C++学习笔记) 二十一. 异常处理

    二十一. 异常处理 ● 异常的概念 程序的错误通常包括:语法错误.逻辑错误.运行异常. 语法错误指书写的程序语句不合乎编译器的语法规则,这种错误在编译.连接时由编译器指出. 逻辑错误是指程序能顺利运行 ...

  9. 十二、jdk工具之jcmd介绍(堆转储、堆分析、获取系统信息、查看堆外内存)

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

随机推荐

  1. 【CSS 】js操作css

    对设置和移除所有 <p> 元素的 "main" 类进行切换: $("button").click(function(){ $("p&quo ...

  2. Update(Stage4):sparksql:第5节 SparkSQL_出租车利用率分析案例

    目录: 1. 业务2. 流程分析3. 数据读取5. 数据清洗6. 行政区信息 6.1. 需求介绍 6.2. 工具介绍 6.3. 具体实现7. 会话统计 导读 本项目是 SparkSQL 阶段的练习项目 ...

  3. YUM方式安装LAMP

    本文介绍两种方法yum安装LAMP, 方法1: 通过httpd的php模块方式安装LAMP 方法2: 通过php-fpm方式安装LAMP 安装环境:CentOS Linux release 7.5.1 ...

  4. Fedora26下Mysql改密码Unknown column 'password' in 'field list'

    本意向修改一个用户的密码,网上搜到的命令为如下 1 mysql> update user set password=password(“新密码”) where user=”用户名”; 执行后报错 ...

  5. JavaScript - 运行机制,作用域,作用域链(Scope chain)

    参考 https://www.jianshu.com/p/3b5f0cb59344 https://jingyan.baidu.com/article/4f34706e18745be386b56d46 ...

  6. [Misc] ZSH 常用快捷键

    安装 zsh 终端执行 brew install zsh 终端执行 vim ~/.bash_profile 命令,打开 .bash_profile 文件 如果没有 vim,请自行安装 在打开的文件中, ...

  7. Solr搜索引擎服务器学习笔记

    Solr简介 采用Java5开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个完善的功能 ...

  8. git——解决每次拉取、提交代码时都需要输入用户名和密码

    在开发中我们经常需要通过 git 对代码进行拉取和提交,频繁地输入用户名和密码会带来很大的麻烦,下面就介绍一下解决git每次拉取.提交代码时都需要输入用户名和密码的方法. 很简单,只要两步骤就能实现: ...

  9. Atom离线插件安装

    1.下载原始的插件包 2.解压放入atom的packages文件夹中 3.通过nodejs的npm指令进行安装 运行->cmd 4.重启atom就好了.

  10. Struts2学习(五)

    表达式 1.表达式语言 ( Expression Language )2.表达式的本质:  就是 按照某种规则 书写的 字符串3.表达式的处理: 一定有一套程序 对 表达式 中的 字符串进行解析和处理 ...