一、log日志
- 用处:记录程序运行过程中的信息
- 优势:可以将系统执行的信息选择性的记录到指定位置;可以以开关的形式控制是否记录日志,不需要修改源代码
- 日志规范:接口的形式。Commons Logging、Simple Logging Facade for Java
二、类加载器
- 作用:将类的class文件加载到内存当中
- 加载的时机:只要使用就会加载。比如创建类的对象、访问类中的成员
- 类加载的过程
1. 加载
- 通过全类名获取此类的二进制字节流
- 将字节流转化为运行时数据结构(加载到内存当中)
- 在内存中生成一个代表这个类的对象,用来存储类的成员信息
2. 验证:确保class文件字节流中包含的信息符合当前虚拟机的要求
3. 准备:为静态成员分配内存并初始化
4. 解析:将类的二进制数据流中的符号引用替换为直接引用
三、配置文件xml
1. 基础概念
-
xml全称:可扩展的标记语言。
-
标记语言:通过标签来描述数据的语言
-
可扩展:标签的名字可以自己定义
2. xml的组成
- 第一行必须是文档声明:<?xml version="1.0" encoding="字符集"?>
- xml标签规则:
- 特殊的标签可以不成对,但是必须有结束标记。比如:
<br/>
- 标签中可以定义属性,属性值要用引号。
<Student id="1">
- xml中的特殊字符:< & > " '
- 使用特殊字符的两种方法:
方法一:
< 等同于 <
> 等同于 >
& 等同于 &
' 等同于 '
" 等同于 "
方法二:
<![CDATA[ ]]>
3. xml文档的约束
- 约束的作用:用来限定xml文件中的标签以及属性的书写
-约束方式:DTD、schema
四、XPath
- 作用:使用路径获取标签或属性
- 成员方法:
//获取单个节点
Node selectSingleNode("表达式")
//获取所有符合要求的表达式
List<Node> selectNodes("表达式")
五、单元测试
1. 基础概念:
- 单元测试是针对最小的功能单元编写的测试代码。
- Java中最小的功能单元是方法。
- 单元测试就是针对Java方法的测试
2. 优点
- 可以灵活的选择要测试的代码,使用@Test进行注解
- 单元测试中的某个方法测试失败,不会影响其他测试方法的测试
3. JUnit单元测试框架的常用注解
-
@Test:用来测试方法
-
@Before:使用这个注解的方法会在测试之前运行。用来对数据进行备份,防止在测试过程中污染数据
-
@After:使用这个注解的方法会在测试之后运行。对数据进行恢复。
4. JUnit测试框架补充:
-
只有public、void、无参、非静态的方法才可以使用JUnit测试。
-
如果要测试有参数的方法,可以创建一个类进行测试。使用断言Assert类中的方法进行判断
Assert.assertEquals(message,expect result, real result)
六、注解(Annotation)
1. 基础概念
- 注解:使用@符号标记
2. 作用:
- 对程序进行标注,为类增加额外的信息
- 为编译器或JVM提供操作提示,编译器或者JVM通过注解完成对应的功能
3. 注解与注释的区别
- 注解:给编译器或者JVM看,会保留到字节码文件中
- 注释:为程序员提供信息,编译时会被擦除
4. 常见的注解
- @Override:用于标记重写的方法
- @Deprecated:用于标记过时的方法/类 。可以使用,但是会有删除线警告。
- @SuppressWarnings(“all”):用于压制警告
5. 自定义注解
5.1 自定义注解的格式
public @interface 注解名称{
public 属性类别 属性名() default 默认值;
}
其中,属性类别:基本数据类型、String、注解、美剧、Class、还有对应的一维数组也可以
6. 元注解:写在注解上的注解
元注解的两个例子
- @Target:限制注解的作用对象
@Target(ElementType.Method)
- @Retention:用来定义注解的生命周期
SOURCE:源码阶段。生成字节码文件中不会有注解
CLASS:字节码阶段。代码运行阶段不会出现
RUNTIME:源码阶段、字节码阶段、运行阶段都会存在
7. 结合反射解析注解可以做一个简单的Test测试
- 获取类的Class文件,通过反射获取类中的方法
//1. 利用反射获取class文件,获取类中的方法信息
Class clazz = Class.forName("myjunit.MethodTest");
Method[] methods = clazz.getDeclaredMethods();
- 注解中的方法:(使用这个方法,可以判断方法是否被注解)
boolean isAnnotationPresent(定义注解的类的class文件)
- 如果方法被注解,使用反射中的invoke方法
//比如method2()被@MyTest注解
boolean result = method2.isAnnotationPresent(MyTest.Class);
//使用invoke方法
method2.invoke(new MethodClass()); //MethodClass是method2所在的类
关于invoke方法(我自己的理解)
为什么要在invoke方法中传入MethodClass的对象?
method2.invoke(MethodClass mc, Object...args)
参数一mc:用MethodClass对象调用method2()
参数二:调用method2()要传递的参数.如果method2没有形参,可以不传递