二十一 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代码开启关闭线程(nginx)
源码: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; pub ...
- web优化(一 前端)
当我们在浏览器地址栏中输入一个URL的时候,网页开始请求,我们在页面上看到的内容就是许多个HTTP请求从服务器返回的数据展示,这些展示的快慢很大程度依赖前端的优化,怎样做好前端的优化,我这里总结了几点 ...
- location练习!(重点)
写location最重要的就是hosts文件,添加一次域名跳转就得添加一条hosts文件 hosts文件: 192.168.200.120 www.a.com 192.168.200.119 www. ...
- Mysql基本用法-存储引擎-04
MYSQL中只有 INNODB和BDB 类型的数据表才能支持事务处理!其他的类型是不支持的!(切记!) Mysql基本用法-存储引擎-02中的test_user表 和 phpcvs表 <?php ...
- git 修改分支 删除分支 新增分支
一.修改分支名 1.本地分支重命名 git branch -m oldName newName 2.将重命名后的分支推送到远程 git push origin newName 3.重新更新所有分支 g ...
- 去重sort|uniq -d
#!/bin/bash ############################################################### #Author :Bing # #Create ...
- python的datetime、random和os模块使用方法
import datetime# print(datetime.date.today())# print(datetime.datetime.today())# res=datetime.dateti ...
- 解决EFCore缓存机制导致的数据查询错误问题
如题,在对同一个Context连续进行相同条件的查询时,会触发EFCore的缓存机制,如果这个过程中数据发生了变化,则会出现错误. 例如:有两个Context实例,一个负责查询,一个负责增删改, A_ ...
- c++构造函数的初始化列表(翁恺c++公开课[13])
初始化列表形式: class Point { private: const float x,y; Point(float xa = 0.0, flato ya = 0.0):y(ya),x(xa) { ...
- mysql path妙用
CREATE TABLE `lc_c_user_path` ( `id` INT ( ) UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` VARCHAR ( ) ...