0


Java_基础加强——日志、类加载器、单元测试、注解

1.日志:

日志的优势:

体系结构:

日志规范:

  1. **·**日志规范大多是一些接口,提供给实现框架去设计的
  2. **·**常见的规范是Commons LoggingJCL)、Simple Logging Facade for Javaslf4j

常见日志框架:

  1. **·**Log4j
  2. **·**Logback(性能更好,广泛使用,重点)

Logback:

  1. 使用Logback需要使用三个模块:
  2. ·slf4j-api:日志规范
  3. ·logback-core:基础模块
  4. ·logback-classic:功能模块,它完整实现了slf4j API
导包:
  1. 需导入上述三个包slf4j-apilogback-corelogback-classic
  2. 导包官方网站:Logback Home (qos.ch)、SLF4J
代码演示:
测试类:
  1. public class LogbackDemo1 {
  2. //获取日志对象
  3. public static final Logger LOGGER = LoggerFactory.getLogger("LogbackDemo1.class");
  4. public static void main(String[] args) {
  5. Scanner sc = new Scanner(System.in);
  6. System.out.println("请输入用户名");
  7. String username = sc.nextLine();
  8. System.out.println("请输入密码");
  9. String password = sc.nextLine();
  10. if("han".equals(username) && "123".equals(password)) {
  11. LOGGER.info("用户登录成功,用户名为:" + username + " 密码为:" + password);
  12. System.out.println("登录成功");
  13. } else {
  14. System.out.println("登录失败");
  15. LOGGER.info("用户登录失败");
  16. }
  17. }
  18. }
xml配置文件:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <!--
  4. CONSOLE :表示当前的日志信息是可以输出到控制台的。
  5. -->
  6. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  7. <!--输出流对象 默认 System.out 改为 System.err-->
  8. <target>System.out</target>
  9. <encoder>
  10. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
  11. %msg:日志消息,%n是换行符-->
  12. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n</pattern>
  13. </encoder>
  14. </appender>
  15. <!-- File是输出的方向通向文件的 -->
  16. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  17. <encoder>
  18. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  19. <charset>utf-8</charset>
  20. </encoder>
  21. <!--日志输出路径-->
  22. <file>D:/Java/JavaSEbase/logback/han-data.log</file>
  23. <!--指定日志文件拆分和压缩规则-->
  24. <rollingPolicy
  25. class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  26. <!--通过指定压缩文件名称,来确定分割文件方式-->
  27. <fileNamePattern>D:/Java/JavaSEbase/logback/han-data-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
  28. <!--文件拆分大小-->
  29. <maxFileSize>1MB</maxFileSize>
  30. </rollingPolicy>
  31. </appender>
  32. <!--
  33. level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
  34. , 默认debug
  35. <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
  36. -->
  37. <root level="info">
  38. <appender-ref ref="CONSOLE"/>
  39. <appender-ref ref="FILE" />
  40. </root>
  41. </configuration>
运行结果:

xml配置文件:

日志级别:
作用:
  1. 用于控制系统中哪些日志级别是可以输出的
级别介绍:
  1. 级别从小到大依次是:TRACE<DEBUG<INFO<WARN<ERROR
  2. 默认级别是debug(忽略大小写),只输出不低于当前级别的日志
  3. ALLOFF分别是打开全部日志和关闭全部日志

2.类加载器:

功能:

  1. 类加载器负责将.class文件(存储的物理文件)加载到内存中

类加载到内存的时机

  1. 1.创建类的实例(对象)
  2. 2.调用类的静态方法
  3. 3.访问类或者接口的类变量(静态),或者为该类变量赋值
  4. 4.使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
  5. 5.初始化某个类的子类
  6. 6.直接使用java.exe命令来运行某个主类
  7. 总结:用到就加载,不用不加载。

类加载的过程:

加载:

验证:

准备:

解析:

初始化:

类加载器的分类:

双亲委派模型:

  1. 每个加载器得到任务就会往上一层委托其他加载器,当最上层加载器无法完成,则又会一层一层往下返回。
  2. 自定义类加载器一般不会使用。

常用方法:

3.单元测试:

  1. 单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法,因此,单元测试就是针对Java方法的测试,进而检查方法的正确性。

Junit单元测试框架

Junit优点:

注意点:

  1. 该测试方法必须是公共的无参数无返回值的非静态方法

使用步骤:

  1. 在实际开发中,如果想要测试一个方法是否正确,并不是直接在当前方法的上面写@Test的,而是自己独立编写一个测试类(不要写main方法),在这个类中,编写一些方法,在方法里面调用要被测试的方法即可。

常用注解:

  1. @Test:测试方法
  2. @Before:用来修饰实例方法,该方法会在每一个测试方法执行之前执行一次
  3. @After:用来修饰实例方法,该方法会在每一个测试方法执行之后执行一次

练习:

  1. 需求:测试File类中的demete方法是否书写正确
  2. 先在当前模块下创建一个文件,存储以下元素
  3. ![](https://img-blog.csdnimg.cn/direct/cace4d7ea6d84998885b602081f31613.png)
代码演示:
  1. public class JunitDemo2 {
  2. //注意不能污染数据
  3. //测试完文件不能少,也不能多出来其他的文件
  4. //1.用Before初始化数据
  5. //2.用Test测试方法
  6. //3.用After还原数据
  7. @Before
  8. public void beforeMethod() throws IOException {
  9. //拷贝文件
  10. File src = new File("C:\\Users\\Han\\IdeaProjects\\myjunit\\src\\a.txt");
  11. File dest = new File("C:\\Users\\Han\\IdeaProjects\\myjunit\\src\\copy.txt");
  12. FileInputStream fis = new FileInputStream(src);
  13. FileOutputStream fos = new FileOutputStream(dest);
  14. int b;
  15. while((b = fis.read()) != -1) {
  16. fos.write(b);
  17. }
  18. fos.close();
  19. fis.close();
  20. }
  21. @Test
  22. public void method() {
  23. File file = new File("C:\\Users\\Han\\IdeaProjects\\myjunit\\src\\a.txt");
  24. boolean delete = file.delete();
  25. boolean exists = file.exists();
  26. //断言
  27. //参数一:出现错误后提示的信息
  28. //参数二:实际的解果
  29. //参数三:预期的结果
  30. Assert.assertEquals("delute方法出错了",delete,true);
  31. Assert.assertEquals("delute方法出错了",exists,false);
  32. }
  33. @After
  34. public void afterMethod() throws IOException {
  35. //恢复文件
  36. File src = new File("C:\\Users\\Han\\IdeaProjects\\myjunit\\src\\copy.txt");
  37. File dest = new File("C:\\Users\\Han\\IdeaProjects\\myjunit\\src\\a.txt");
  38. FileInputStream fis = new FileInputStream(src);
  39. FileOutputStream fos = new FileOutputStream(dest);
  40. int b;
  41. while((b = fis.read()) != -1) {
  42. fos.write(b);
  43. }
  44. fos.close();
  45. fis.close();
  46. }
  47. }
运行结果:

扩展:

  1. 默认情况下,相对路径是相对项目的,而在单元测试中,相对路径是相对当前模块的。

注解:

  1. Annotation表示注解,注解是给编译器或JVM看的,它们可以根据注解来完成对应的功能

注释和注解的区别:

共同点:都可以对程序进行解释说明。

不同点:注释,是给程序员看的。只在Java中有效。在class文件中不存在注释的。

当编译之后,会进行注释擦除。

注解,是给虚拟机看的。当虚拟机看到注解之后,就知道要做什么事情了。

作用:

  1. 对我们的程序进行标注,通过注解可以给类增加额外的信息

Java已提供的注解:

  1. @Override:表示重写的方法
  2. @Deprecated:表示已过时的方法
  3. @SuppressWarnings("all"):压制所有警告信息(黄色波浪线)

自定义注解方法:

特殊属性:

  1. value
  2. 当注解中只有"一个属性",并且属性名是"value",使用注解时,可以省略value属性名

代码演示:

  1. //注解的定义
  2. public @interface Anno2 {
  3. public String value();
  4. public int age() default 23;
  5. }
  6. //注解的使用
  7. @Anno2("123")
  8. public class AnnoDemo2 {
  9. @Anno2("123")
  10. public void method(){
  11. }
  12. }

元注解:

  1. 可以写在注解上面的注解
  2. @Target :指定注解能在哪里使用
  3. @Retention :可以理解为保留时间(生命周期)
标签: java log4j

本文转载自: https://blog.csdn.net/wsxcjg/article/details/139119843
版权归原作者 wsxcjg 所有, 如有侵权,请联系我们删除。

“Java_基础加强——日志、类加载器、单元测试、注解”的评论:

还没有评论