> 技术文档 > log日志、类加载器、xml、XPath、单元测试、注解

log日志、类加载器、xml、XPath、单元测试、注解


一、log日志

- 用处:记录程序运行过程中的信息

- 优势:可以将系统执行的信息选择性的记录到指定位置;可以以开关的形式控制是否记录日志,不需要修改源代码

- 日志规范:接口的形式。Commons Logging、Simple Logging Facade for Java

二、类加载器

- 作用:将类的class文件加载到内存当中

- 加载的时机:只要使用就会加载。比如创建类的对象、访问类中的成员

- 类加载的过程

1. 加载
  1. 通过全类名获取此类的二进制字节流
  2. 将字节流转化为运行时数据结构(加载到内存当中)
  3. 在内存中生成一个代表这个类的对象,用来存储类的成员信息
2. 验证:确保class文件字节流中包含的信息符合当前虚拟机的要求
3. 准备:为静态成员分配内存并初始化
4. 解析:将类的二进制数据流中的符号引用替换为直接引用

三、配置文件xml

1. 基础概念

  1. xml全称:可扩展的标记语言。

  2. 标记语言:通过标签来描述数据的语言

  3. 可扩展:标签的名字可以自己定义

2. xml的组成

- 第一行必须是文档声明:
- xml标签规则:
  1. 特殊的标签可以不成对,但是必须有结束标记。比如:
  2. 标签中可以定义属性,属性值要用引号。
- xml中的特殊字符: \" \'
  • 使用特殊字符的两种方法
方法一: 等同于 >& 等同于 &\' 等同于 '\" 等同于 "方法二:

3. xml文档的约束

- 约束的作用:用来限定xml文件中的标签以及属性的书写
-约束方式:DTD、schema

四、XPath

- 作用:使用路径获取标签或属性

- 成员方法:

//获取单个节点Node selectSingleNode(\"表达式\")//获取所有符合要求的表达式List selectNodes(\"表达式\")

五、单元测试

1. 基础概念:

  1. 单元测试是针对最小的功能单元编写的测试代码。
  2. Java中最小的功能单元是方法
  3. 单元测试就是针对Java方法的测试

2. 优点

  1. 可以灵活的选择要测试的代码,使用@Test进行注解
  2. 单元测试中的某个方法测试失败,不会影响其他测试方法的测试

3. JUnit单元测试框架的常用注解

  1. @Test:用来测试方法

  2. @Before:使用这个注解的方法会在测试之前运行。用来对数据进行备份,防止在测试过程中污染数据

  3. @After:使用这个注解的方法会在测试之后运行。对数据进行恢复

4. JUnit测试框架补充:

  1. 只有public、void、无参、非静态的方法才可以使用JUnit测试。

  2. 如果要测试有参数的方法,可以创建一个类进行测试。使用断言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. 元注解:写在注解上的注解

元注解的两个例子

  1. @Target:限制注解的作用对象
@Target(ElementType.Method)
  1. @Retention:用来定义注解的生命周期
SOURCE:源码阶段。生成字节码文件中不会有注解CLASS:字节码阶段。代码运行阶段不会出现RUNTIME:源码阶段、字节码阶段、运行阶段都会存在

7. 结合反射解析注解可以做一个简单的Test测试

  1. 获取类的Class文件,通过反射获取类中的方法
//1. 利用反射获取class文件,获取类中的方法信息 Class clazz = Class.forName(\"myjunit.MethodTest\"); Method[] methods = clazz.getDeclaredMethods();
  1. 注解中的方法:(使用这个方法,可以判断方法是否被注解)
boolean isAnnotationPresent(定义注解的类的class文件)
  1. 如果方法被注解,使用反射中的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没有形参,可以不传递