day014-反射、注解
1、 Junit
1.1什么是Junit
Junit是Java语言编写的第三方单元测试框架(工具)。
1.2单元测试
在Java中,一个类就是一个单元。
单元测试:开发中编写的一小段代码,用来检测类中的某个方法的功能或业务逻辑是否正确。
1.3 Junit的作用
可以让方法独立运行。
用来检测类中的某个方法的功能或业务逻辑是否正确,最大限度保证程序的稳定性和正确性。
1.4 Junit的使用步骤
编写业务类,在业务类中编写业务方法。
编写测试类,在测试类中编写测试方法。
测试类命名规则:以Test开头,后面跟业务类类名,使用驼峰命名法。
比如:业务类类名ProductDao,测试类类名则为:TestProduct
1.5测试方法特点
命名规则:以test开头,以业务名结尾,比如:业务方法名为save,测试方法名为testSave。
声明要求:必须是public修饰的,必须没有返回值,必须没有参数,必须使用@Test注解修饰。
1.6 如何运行测试方法
选择方法名-à右键-àRun“方法名;运行选中的测试方法。
选择类名-à右键-àRun“类名;运行类中所有的测试方法
选择模块名-à右键-àRun“类名;运行模块中所有的测试方法
1.7 查看测试结果
绿色:测试通过
红色:测试失败,有问题
断言:预先判断某个条件一定成立,如果条件不成立,则直接崩溃。
Assert.assertEquals(message, except, actual)
Message:错误提示信息字符串
Excepted:期望值
Actual:实际值
1.8 常用注解”
@Before:修饰方法,会在每一个测试方法执行之前执行一次
@After:修饰方法,会在每一个测试方法执行之后执行一次
@BeforeClass :修饰静态方法,该方法会在所有测试方法执行之前执行一次
@AfterClass:修饰静态方法,该方法会在所有测试方法执行之后执行一次
2、 反射
2.1 反射的概念
反射是一种机制,利用该机制可以在程序的运行过程中对类进行解剖,然后操作类中的所有成员。
2.2 反射的使用场景
开发IDE(集成开发环境,比如Eclipse, IDEA…)
各种框架的设计,比如:Hibernate, Spring, Struct, Java三大框架
2.2.1反射机制使用前提
必须要获得类的字节码文件对象,即是Class对象
2.3 获得Class对象的三种方式
方式1:通过对象名调用getClass方法获得
方式2: 通过类名.class获得
方式3:通过Class类的静态方法获得:static Class forName(“类全名字符串”)
以上三种方式获得的Class对象都是相同。
2.4 获取Class对象的信息
(1)String getSimpleName() 获得简单类名,只是类名,没有包
(2)String getName 获得完整类名,包含包名+类名
(3)T newInstance() 创建此Class对象所表示的类的一个新实例,类必须有public修饰的无参数的构造方法
2.5 获取Class对象的Constructor信息
2.5.1 Constructor类概述
每一个类中的构造方法都是一个Constructor类的对象。
获得构造方法对象的目的就是为了利用构造方法对象创建对象。
2.5.2 Class类中与Constructor相关的方法
(1). Constructor getConstructor(Class... parameterTypes)
根据参数类型获取构造方法对象,只能获得public修饰的构造方法。
(2) Constructor getDeclaredConstructor(Class... parameterTypes)
根据参数类型获取构造方法对象,包括private修饰的构造方法。
(3)Constructor[] getConstructors()
获取所有的public修饰的构造方法
(4)Constructor[] getDeclaredConstructors()
获取所有构造方法,包括privat修饰的
2.5.3 Constructor类中成员方法对象
(1) T newInstance(Object... initargs) 根据指定参数创建对象。
(2) void setAccessible(true) 暴力反射,设置为可以直接访问私有类型的构造方法。
2.6 获取Class对象的Constructor信息
每一个类中的成员方法都是一个Method类的对象。
获得Method方法对象的目的就是为了要调用该方法。
2.6.1 Class类中与Method相关方法
(1)Method getMethod("方法名", 方法的参数类型... 类型)
根据方法名和参数类型获得一个方法对象,只能是获取public修饰的
(2)Method getDeclaredMethod("方法名", 方法的参数类型... 类型)
根据方法名和参数类型获得一个方法对象,包括private修饰的
(3)Method[] getMethods()
获取所有的public修饰的成员方法,包括父类中。
(4)Method[] getDeclaredMethods()
获取当前类中所有的方法,包含私有的,不包括父类中。
2.6.2 Method 类中常见方法
(1)Object invoke(Object obj, Object …args)
根据参数args调用对象obj的该成员方法
如果obj=null,则表示该方法是静态方法
(2)void setAccesible(Boolean flag)
暴力反射,私有修饰的成员方法也可以设置为可以直接调用
2.7 获取Class对象的Field信息
每一个类中的成员变量都是一个Field类的对象。
获得Field方法对象的目的就是为了要调用该成员变量。
2.7.1 Class类中与Field相关的方法
(1)Field getDeclaredField(String name)
根据属性名获得属性对象,包括private修饰的
(2)Field getField(String name)
根据属性名获得属性对象,只能获取public修饰的
(3 Field[] getFields()
获取所有的public修饰的属性对象,返回数组。
(4)Field[] getDeclaredFields()
获取所有的属性对象,包括private修饰的,返回数组。
2.7.3 类中常用方法
void set(Object obj, Object value)
Object get(Object obj)
void setAccessible(true); 暴力反射
Class getType(); 获取属性的类型,返回Class对象。
3. 注解
注解相当一种标记,是类的组成部分,可以给类携带一些额外的信息。
注解可以加在包,类,字段,方法,方法参数以及局部变量上。
3.1 自定义注解
注解定义格式:@interface 注解名{}
3.2 注解的属性
3.2.1属性的定义格式
格式1:数据类型 属性名();
格式2:数据类型 属性名() default 默认值;
属性的注意事项:如果属性有默认值,则在使用注解时可以不用给属性赋值,否则在使用注解时必须给属性赋值。
3.2.2属性可用的数据类型
八种数据类型
String,Class,枚举类,注解类型
以上数据类型的数组形式
3.2.3特殊属性:value
如果注解只有一个属性且属性名为value时, 在使用注解时可以直接给value赋值,而不需要给出属性名。
如果注解中除了value属性之外还有其他属性,且其他属性至少有一个没有默认值,则使用注解时value属性名不能省略。
3.3元注解
3.3.1概述
Java官方提供的注解。专门用来定义注解的注解。
任何官方的注解在定义时都使用了元注解
3.3.2常用的元注解
@Target
@Retention
(1)@Target注解
用来表示注解使用的位置
常用值如下:ElementType 。TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE
(2)@Retention
用来标识注解的生命周期
常用值如下:SOURCE, 只作用在源码阶段,生成class文件不存在
CLASS, 作用在源码阶段,字节码阶段,不作用在运行时阶段
RUNTIME 作用在所有阶段
3.4注解解析
通过Java技术获取注解信息的过程称为注解解析
3.4.1注解解析相关的类和接口
Annotation : 该类是所有注解的父类
AnnotatedElement:该接口定义了与注解解析相关的方法,常用的方法以下四个:
(1)Boolean isAnnotationPresent(Class annotationClass); 判断当前对象是否有指定的注解,有则返回true,否则返回false
(2)T getAnnotation(Class<T> annotationClass); 获得当前对象上指定的注解对象
(3)Annotation[] getAnnotations(); 获得当前对象及其从父类上继承的所有的注解对象
(4)Annotation[] getDeclaredAnnotation(); 获得当前对象上所有的注解对象,不包括父类的
3.4.2获取注解数据的原理
注解作用在成员上,就通过反射获得该成员的对象来得到它的注解。
比如:注解作用在成员方法,就通过方法(Method)对象得到它的注解。
注解作用在类上,就通过Class对象得到它的注解。
day014-反射、注解的更多相关文章
- 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】
一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...
- Javaweb学习笔记——(二十七)——————泛型、泛型的通配符、反射泛型信息、反射注解、注解
泛型 1.泛型类:具有一个或多个类型变量的类,称之为泛型类 class A<T>{ } 2.在创建泛型实例时,需要为其类型变量赋值 A<String> a = new ...
- 【译】8. Java反射——注解
原文地址:http://tutorials.jenkov.com/java-reflection/annotations.html ================================== ...
- JAVA-注解(2)-自定义注解及反射注解
自定义注解开发 1.开发一个注解类 开发一个注解类的过程,非常类似于开发一个接口,只不过需要通过@interface关键字来声明 2.使用元注解修饰注解的声明 所谓的原注解是用来修饰注解声明的注释,可 ...
- Java通过反射注解赋值
前段时间,领导分配一个统计销售区域汇总的数据,解决方案使用到了反射获取注解,通过注解获取属性或者设置字段属性. 问题描述 查询公司列表,分别是公司id.区域id.区域名称: 公司id 区域id 区域名 ...
- java反射--注解的定义与运用以及权限拦截
自定义注解类编写的一些规则: 1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是 ...
- java反射注解妙用-获取所有接口说明
转载请注明出处:https://www.cnblogs.com/wenjunwei/p/10293490.html 前言 最近在做项目权限,使用shiro实现restful接口权限管理,对整个项目都进 ...
- Java反射+注解案例
注解类代码,注解的属性可以有多个: package reflect; import java.lang.annotation.Retention; import java.lang.annotatio ...
- 5.13Junit单元测试-反射-注解
一.Junit单元测试 * 测试分类: 1.黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值 2.白盒测试:需要些代码的.关注程序具体的执行流程 Junit使用:白盒测试 步骤: 1.定义 ...
- 大数据JavaWeb之java基础巩固----Junit&反射&注解
最近打算从0开始学学大数据,目前的主业是Android开发,但是当年毕业之后其实是搞J2EE的,所以打算没事又来拓展一下后台的技能,扩宽一下自己的知识体系对于自己的未来也能够多一些可能,另外大数据的一 ...
随机推荐
- 最近闲着利用QQ协议写了一个聊天器
最近闲着,把以前一个利用QQ协议写了的聊天器找出来玩,采用的是QQ比较稳定的协议,之前听说有人用WEB协议,或是安卓版QQ协议,都不太稳定.而我这个版的已经有好几年没动了.今天找出来依旧能登陆.获取好 ...
- LightOJ - 1234 分块预处理
求∑1/i,但是范围很大 和bitmap的想法一样,分个块,均摊复杂度就降下来了 //到底排行榜上的0ms是怎么做到的? #include<bits/stdc++.h> using nam ...
- nginx 反向代理导致的session丢失的问题
[原文链接] https://blog.csdn.net/xiaweiyidengzhewo/article/details/80921750 注意这篇文章解释的是“丢失”而不是“一致性”
- js 中 forEach 和 map
共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前项的索引index,原始数组input. 3.匿名 ...
- windows 系统C盘暴增
系统: Windows Server 2012R2 问题: C盘200G的空间,暴增剩余3G.但是查看仅有69G的空间占用. 根源:Windows的虚拟文件,驱动器分页. 解决方案: 我的电脑-> ...
- linux 卡在进度条进不去解决办法之一
centos为例 一, 如下: 如果这个地方卡住了的话也许是你上次改了passwd文件,这个是其中一个情况. 如果刚刚开机就卡住了或者怎么卡住了的话在开机的读条时候摁esc显示读取的进程,根据显示的错 ...
- HTML问题 | 两个Input在同一行连着不留缝隙
方法1:让两个 input 连在一起写 不换行 <div class="inputDiv"> <input type="text" place ...
- unity手游使用terrian注意事项
1.Terrain比较占性能,普通机器测试,未开terrain 60帧,开启terrain后 30帧 2.Terrain的size大小与占用性能无关,不过越小的Terrain的烘焙上去的阴影越模糊 ...
- 初识backbone.js
backbone,英文意思是:勇气, 脊骨,但是在程序里面,尤其是在backbone后面加上后缀js之后,它就变成了一个框架,一个js库. backbone.js,不知道作者是以什么样的目的来对其命名 ...
- 记一次MongoDB性能问题
下面文章转载自火丁笔记,原作者描述了一次MongoDB数据迁移过程中遇到的性能问题及其解决方案,中间追查问题的方法和工具值得我们学习.下面是其原文: 最近忙着把一个项目从MySQL迁移到MongoDB ...