什么是注解?

  • 注解和接口,类属于同一个级别
  • 注解可以在变量、方法、类上加载
  • 注解可以有属性也可以没有属性
  • 注解是有作用范围(源码、编译期间,运行期间)
      • 源码期间:例如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. 【转】Swagger详解(SpringBoot+Swagger集成)

    Swagger-API文档接口引擎Swagger是什么 Swagger是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器 ...

  2. SSD算法

    SSD算法 2016  出的目标检测算法 SSD效果主要有三点: 1.多尺度 2.设置了多种宽高比的(anchor box)default box 3.数据增强 1.1  设置 default box ...

  3. 刚开始用springboot踩的好多坑!!!

    今天,刚开始就在刚才我留下了激动的泪水,因为我捯饬springboot已经有几天了,我通过看视频学的,但是坑实在是太多了,今年是鼠年~~~LOL----瘟疫之源来了, 被困在了老家不能走,老家网实在是 ...

  4. 「Luogu P5368 [PKUSC2018]真实排名」

    PKUSC签到题 题目大意 给出一个长度为 \(N\) 的序列,序列中有 \(K\) 个数会乘二,对于每个数计算在乘二后大于等于这个数的个数与乘二前没有发生变化的方案数. 分析 思路很清晰,可以将答案 ...

  5. maven设置镜像地址

    方法一:在maven文件夹下的settings.xml中添加(对所有的项目都有效) <mirror> <id>alimaven</id> <name>a ...

  6. Linux - 监控工具Conky

    主题Harmattan,https://www.jianshu.com/p/5c8d4a1f4c91,这个主题在deepin linux下有黑框背景,因为是伪透明,所以选择黑色背景的主题即可

  7. JavaScript 引擎「V8」发布 8.0 版本,内存占用量大幅下降

    上周,JavaScript 引擎「V8」的开发团队在该项目官方网站上正式宣布推出最新的 8.0 版本.这次更新的重点主要集中在错误修复及性能改善上,正式的版本将在数周后随着谷歌 Chrome 80 稳 ...

  8. MD5 加密解密字符串

    方法1: using System.Text; using System.Security.Cryptography; public string Hash(string toHash) { MD5C ...

  9. PAT T1003 Universal Travel Sites

    网络流模板~ #include<bits/stdc++.h> using namespace std; ; const int inf=1e9; queue<int> q; i ...

  10. 【PAT甲级】1033 To Fill or Not to Fill (25 分)(贪心,思维可以做出简单解)

    题意: 输入四个正数C,DIS,D,N(C<=100,DIS<=50000,D<=20,N<=500),分别代表油箱容积,杭州到目标城市的距离,每升汽油可以行驶的路程,加油站数 ...