二十一 JDK注解&注解案例
什么是注解?
- 注解和接口,类属于同一个级别
- 注解可以在变量、方法、类上加载
- 注解可以有属性也可以没有属性
- 注解是有作用范围(源码、编译期间,运行期间)
- 源码期间:例如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注解&注解案例的更多相关文章
- java web学习总结(二十一) -------------------模拟Servlet3.0使用注解的方式配置Servlet
一.Servlet的传统配置方式 在JavaWeb开发中, 每次编写一个Servlet都需要在web.xml文件中进行配置,如下所示: 1 <servlet> 2 <servlet- ...
- JPA学习(二、JPA_基本注解)
框架学习之JPA(二) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 ...
- JDK中注解的底层实现
前提 用Java快三年了,注解算是一个常用的类型,特别是在一些框架里面会大量使用注解做组件标识.配置或者策略.但是一直没有深入去探究JDK中的注解到底是什么,底层是怎么实现了?于是参考了一些资料,做了 ...
- 2017.2.13 开涛shiro教程-第十二章-与Spring集成(二)shiro权限注解
原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第十二章-与Spring集成(二)shiro权限注解 shiro注 ...
- 阶段3 2.Spring_05.基于XML的IOC的案例1_4 注解IOC案例-把自己编写的类使用注解配置
注解改造案例 复制之前的xml配置的pom.xml里面的依赖. 复制com文件 bean.xml配置文件也拷贝过来 测试类也复制过来 开始基于注解的IOC配置 右键项目,选择maven.选择更新 更新 ...
- 使用JDK开发WebServrice案例
使用JDK开发WebServrice案例: 一.开发WebService服务器端 第一步:创建Java工程 ,创建相应的包(服务端)使用JDK开发(1.6以上版本) 第二步:建一个接口WebServi ...
- 【圣诞特献】Web 前端开发精华文章推荐【系列二十一】
<Web 前端开发精华文章推荐>2013年第九期(总第二十一期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 ...
- (C/C++学习笔记) 二十一. 异常处理
二十一. 异常处理 ● 异常的概念 程序的错误通常包括:语法错误.逻辑错误.运行异常. 语法错误指书写的程序语句不合乎编译器的语法规则,这种错误在编译.连接时由编译器指出. 逻辑错误是指程序能顺利运行 ...
- 十二、jdk工具之jcmd介绍(堆转储、堆分析、获取系统信息、查看堆外内存)
目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...
随机推荐
- Java面向对象编程 -1.4
对象内存分析 对象实例化操作初步分析 Java之中类属于引用数据类型,引用数据类型最大的困难之处在于要进行内存的管理,同时在进行操作的时候也会有内存关系的变化. 所以本次针对于之前的程序的内存关系进行 ...
- linux的压力测试工具
只能用于http的测试工具: ab: 安装方法:yum install httpd-tools -y 使用:ab -c 1000 -n 10000 + ip -c 为并发数,-n ...
- jackson处理日期异常
原 jackson处理日期异常 2018年01月09日 10:50:19 阅读数:70 1.异常信息 2.原因 默认情况下,fasterxml json只支持几种format,但是肯定不支持" ...
- Vulnhub_DC8 记录
目录 DC8 经验 & 总结 步骤流水 信息搜集 80端口 获取Shell 提权 DC8 经验 & 总结 对页面的功能和对应的url要敏感. 所有的功能都要测试,要雨露均沾. 提示说的 ...
- js数组去重解决方案
js数组去重是前端面试中经常被问的题目,考察了面试者对js的掌握,解决问题的思路,以及是否具有专研精神.曾经一位前端界大神告诉我,解决问题的方式有很多种,解决问题时多问问自己还有没有其他的方法,探求最 ...
- [转]BeanUtil使用
BeanUtils的使用 转载自:https://blog.csdn.net/xxf159797/article/details/53645722 1.commons-beanutils的介绍 com ...
- 动态代理Cglib
jar包 <!-- https://mvnrepository.com/artifact/cglib/cglib --><dependency> <groupId> ...
- 解决安装PyMySQL一直停在Building wheels for collected package:cryptography, cffi, pycparser的问题
我的运行环境为: 硬件:树莓派3b 系统:ubuntu_meta_16.04.2 因为项目需要,我在树莓派上搭建了基于python编程的Django的web框架,需要从MySQL中读取树莓派以及传感器 ...
- windows下svn post-commit的实现
前言: 好的!在结束了上一博客教程的Subversion安装之后.我们开始了下一项工作,windows版本下 svn post-commit的实现.说实话,这方面的知识网上的知识并不是很多~~~~~~ ...
- python随机函数.2020.2.26
随机生成函数: import random //首先要引用random模板 print(random.randint(0,9)) //random的语法 random.randint(0,9 ...