[TOC]
# 类加载器
类加载器就加载字节码文件(.class)
![](https://box.kancloud.cn/5c85e2b3157c3553ceb7787b24ef4f7e_803x299.jpg)
## 类加载器的种类
类加载器有三种,不同类加载器加载不同的
![](https://box.kancloud.cn/10caa57d3d833c89a6f255ede198aa7b_622x268.jpg)
1)BootStrap:引导类加载器:加载都是最基础的文件
2)ExtClassLoader:扩展类加载器:加载都是基础的文件
3)AppClassLoader:应用类加载器:三方jar包和自己编写java文件
怎么获得类加载器?
ClassLoader 字节码对象.getClassLoader();
~~~
//获得Demo字节码文件的类加载器
Class clazz = Demo.class;//获得Demo的字节码对象
ClassLoader classLoader = clazz.getClassLoader();//获得类加载器
//getResource的参数路径相对classes(src)
//获得classes(src)下的任何的资源
String path = classLoader.getResource("com/wdsa/classloader/jdbc.properties").getPath();
//classLoader.getResourceAsStream("");
System.out.println(path);
~~~
# 注解
#
# junit4注解
~~~
/*
* @Test:将一个普通方法修饰为一个测试方法
* @Test(exception=XXX.class)
* @Test(time=毫秒)
* @BeforeClass:它会在所有的测试方法前被执行,static修饰
* @AfterClass:它会在所有的测试方法后被执行,static修饰
* @Before:它会在每一个测试方法前被执行一次
* @After:它会在每一个测试方法后被执行一次
* @Ignore:省略
* @RunWith:修改运行器org。junit。runner。Runner
*
* */
~~~
其实@Test不仅可以修饰一个普通方法为测试方法,还可以获取异常或者控制测试方法的执行时间
## @Test的功能
A,获取异常
B,控制测试代码执行时间
A,获取异常代码展示
1,获取异常,对异常的捕获:@Test(expected=XXX.class)
~~~
package com.duo.util;
import static org.junit.Assert.*;
import org.junit.Test;
public class Anotation {
@Test(expected=ArithmeticException.class)
public void testDivide(){
assertEquals(4, new Calculate().divide(12, 0));
}
}
~~~
运行后结果
![](https://box.kancloud.cn/49e4d8fd2fe92e3899b29b82aff6af7d_469x333.png)
2. 没有通过@Test(expected=ArithmeticException.class)注解时代码以及结果:
~~~
package com.duo.util;
import static org.junit.Assert.*;
import org.junit.Test;
public class Anotation {
@Test
public void testDivide(){
assertEquals(4, new Calculate().divide(12, 0));
}
}
~~~
运行结果
![](https://box.kancloud.cn/685b5046e3befec802fe0ba2b702d07b_459x419.png)
B,控制测试代码执行时间,代码展示
测试方法控制@Test(timeout=毫秒),主要是针对代码中有循环代码的测试控制或者超时运行不符合预期的判定
1,我们使用对一个死循环进行测试:
~~~
package com.duo.util;
import static org.junit.Assert.*;
import org.junit.Test;
public class Anotation {
@Test(timeout=2000)
public void testWhile(){
while(true){
System.out.println("run forever...");
}
}
}
~~~
结果及时运行2秒后系统自动停止运行;
2,让当前线程运行2000毫秒,测试代码运行3000毫秒,符合预期结果
~~~
package com.duo.util;
import static org.junit.Assert.*;
import org.junit.Test;
public class Anotation {
@Test(timeout=3000)
public void testReadFile(){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
~~~
运行结果通过;
也可以通过调整测试时间比线程时间小,测试不符合预期的场景;
三,Ignore注解(该注解可以忽略当前的运行的方法,有时候改测试方法没有实现或者以后再实现)
~~~
package com.duo.util;
import static org.junit.Assert.*;
import org.junit.Ignore;
import org.junit.Test;
public class Anotation {
@Test(expected=ArithmeticException.class)
public void testDivide(){
assertEquals(4, new Calculate().divide(12, 0));
}
@Ignore
@Test(timeout=2000)
public void testWhile(){
while(true){
System.out.println("run forever...");
}
}
@Test(timeout=3000)
public void testReadFile(){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
~~~
运行结果
![](https://box.kancloud.cn/1eeaf7b00e804bf659bffa8c71ee3203_679x174.png)
四,RunWith,可以修改测试运行器:org.junit.runner.Runner(后面使用到再解释)
五,断言:assert
断言assert的好多方法可以直接使用,主要是使用了静态导入:import static org.junit.Assert.*;
- 基础
- 编译和安装
- scanner类(键盘录入)
- Random类(随机数)
- 数组
- 方法
- 类
- ArrayList集合
- char与int
- eclipse
- IDEA
- 变量与常量
- 常用API
- String,StringBuffer,StringBuilder
- 正则,Date,DateFormat,Calendar
- 包装类,System,Math,Arrays,BigInteger,BigDecimal
- 集合,迭代器,增强for,泛型
- List,set,判断集合唯一
- map,Entry,HashMap,Collections
- 异常
- IO
- File
- 递归
- 字节流
- 字符流
- IO流分类
- 转换流
- 缓冲流
- 流的操作规律
- properties
- 序列化流与反序列化流
- 打印流
- commons-IO
- IO流总结
- 多线程
- 线程池
- 线程安全
- 线程同步
- 死锁
- lock接口
- ThreadLoad
- 等待唤醒机制
- 线程状态
- jdbc
- DBUtils
- 连接池DBCP
- c3p0连接池
- 网络编程
- 多线程socket上传图片
- 反射
- xml
- 设计模式
- 装饰器模式
- web service
- tomcat
- Servlet
- response
- request
- session和cookie
- JSP
- EL
- JSTL
- 事务
- 监听器Listener
- 过滤器Filter
- json
- linux安装软件
- 反射详解
- 类加载器和注解
- 动态代理
- jedis
- Hibernate
- 简介
- 创建映射文件
- Hibernate核心配置文件
- 事务和增删改查
- HibernateUtils
- 持久化对象的三种状态
- 检索方式
- query
- Criteria
- SQLQuery
- 持久化类
- 主键生成策略
- 缓存
- 事务管理
- 关系映射
- 注解
- 优化
- struts2
- 搭建
- 配置详解
- Action
- 结果跳转方式
- 访问ServletAPI方式
- 如何获得参数
- OGNL表达式
- valueStack 值栈
- Interceptor拦截器
- spring
- 导包
- IOC和DI
- Bean获取与实例化
- Bean属性注入
- spring注解
- 注解分层
- junit整合
- aop
- 动态代理实现
- cglib代理实现
- aop名词
- spring的aop
- aop-xml详解
- aop-注解详解
- 代理方式选择
- jdbcTemplate
- spring事务管理
- 回滚注意
- 事务传播属性
- MyBatis
- MyBatis简介
- 入门程序
- 与jdbc hibernate不同
- 原始Dao开发
- Mapper动态代理方式
- SqlMapConfig.xml配置文件
- 输入参数pojo包装类
- resultMap
- 动态sql
- 一对一关联
- 一对多
- 整合spring
- 逆向工程
- maven
- maven简介
- 仓库
- maven目录结构
- maven常用命令
- 生命周期
- eclipse中maven插件
- 入门程序
- 整合struct
- 依赖范围
- 添加插件
- idea配置
- jar包冲突
- 分模块开发
- 构建可执行的jar包(包含依赖jar包)
- springMVC
- 处理流程
- java面试
- java版本升级
- java1-8版本变更
- java9新特性
- 锁
- java资料
- idea
- jdk版本切换
- log4j
- 入门实例
- 基本使用方法
- Web中使用Log4j
- spring中使用log4j
- java代码优化