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

ops/2024/10/18 14:26:20/

1.日志:

日志的优势:

体系结构:

日志规范:

        ·日志规范大多是一些接口,提供给实现框架去设计的

        ·常见的规范是Commons Logging(JCL)、Simple Logging Facade for Java(slf4j)

常见日志框架:

        ·Log4j

        ·Logback(性能更好,广泛使用,重点)

Logback:

        使用Logback需要使用三个模块:

        ·slf4j-api:日志规范

        ·logback-core:基础模块

        ·logback-classic:功能模块,它完整实现了slf4j API

导包:

        需导入上述三个包slf4j-api、logback-core、logback-classic

        导包官方网站:Logback Home (qos.ch)、SLF4J

代码演示:
测试类:
java">public class LogbackDemo1 {//获取日志对象public static final Logger LOGGER = LoggerFactory.getLogger("LogbackDemo1.class");public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入用户名");String username = sc.nextLine();System.out.println("请输入密码");String password = sc.nextLine();if("han".equals(username) && "123".equals(password)) {LOGGER.info("用户登录成功,用户名为:" + username + " 密码为:" + password);System.out.println("登录成功");} else {System.out.println("登录失败");LOGGER.info("用户登录失败");}}}
xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--CONSOLE :表示当前的日志信息是可以输出到控制台的。--><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><!--输出流对象 默认 System.out 改为 System.err--><target>System.out</target><encoder><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level]  %c [%thread] : %msg%n</pattern></encoder></appender><!-- File是输出的方向通向文件的 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern><charset>utf-8</charset></encoder><!--日志输出路径--><file>D:/Java/JavaSEbase/logback/han-data.log</file><!--指定日志文件拆分和压缩规则--><rollingPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--通过指定压缩文件名称,来确定分割文件方式--><fileNamePattern>D:/Java/JavaSEbase/logback/han-data-%d{yyyy-MMdd}.log%i.gz</fileNamePattern><!--文件拆分大小--><maxFileSize>1MB</maxFileSize></rollingPolicy></appender><!--level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 默认debug<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。--><root level="info"><appender-ref ref="CONSOLE"/><appender-ref ref="FILE" /></root>
</configuration>
运行结果:

xml配置文件:

日志级别:
作用:

        用于控制系统中哪些日志级别是可以输出的

级别介绍:

        级别从小到大依次是:TRACE<DEBUG<INFO<WARN<ERROR

        默认级别是debug(忽略大小写),只输出不低于当前级别的日志

        ALL和OFF分别是打开全部日志和关闭全部日志

        

2.类加载器:

功能:

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

类加载到内存的时机

        1.创建类的实例(对象)

        2.调用类的静态方法

        3.访问类或者接口的类变量(静态),或者为该类变量赋值

        4.使用反射方式来强制创建某个类或接口对应的java.lang.Class对象

        5.初始化某个类的子类

        6.直接使用java.exe命令来运行某个主类

        总结:用到就加载,不用不加载。

类加载的过程:

加载:

验证:

准备:

解析:

初始化:

类加载器的分类:

双亲委派模型:

        每个加载器得到任务就会往上一层委托其他加载器,当最上层加载器无法完成,则又会一层一层往下返回。

        自定义类加载器一般不会使用。

常用方法:

3.单元测试:

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

Junit单元测试框架

Junit优点:

注意点:

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

使用步骤:

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

常用注解:

        @Test:测试方法

        @Before:用来修饰实例方法,该方法会在每一个测试方法执行之前执行一次

        @After:用来修饰实例方法,该方法会在每一个测试方法执行之后执行一次

练习:

        需求:测试File类中的demete方法是否书写正确

        先在当前模块下创建一个文件,存储以下元素

        

代码演示:
java">public class JunitDemo2 {//注意不能污染数据//测试完文件不能少,也不能多出来其他的文件//1.用Before初始化数据//2.用Test测试方法//3.用After还原数据@Beforepublic void beforeMethod() throws IOException {//拷贝文件File src = new File("C:\\Users\\Han\\IdeaProjects\\myjunit\\src\\a.txt");File dest = new File("C:\\Users\\Han\\IdeaProjects\\myjunit\\src\\copy.txt");FileInputStream fis = new FileInputStream(src);FileOutputStream fos = new FileOutputStream(dest);int b;while((b = fis.read()) != -1) {fos.write(b);}fos.close();fis.close();}@Testpublic void method() {File file = new File("C:\\Users\\Han\\IdeaProjects\\myjunit\\src\\a.txt");boolean delete = file.delete();boolean exists = file.exists();//断言//参数一:出现错误后提示的信息//参数二:实际的解果//参数三:预期的结果Assert.assertEquals("delute方法出错了",delete,true);Assert.assertEquals("delute方法出错了",exists,false);}@Afterpublic void afterMethod() throws IOException {//恢复文件File src = new File("C:\\Users\\Han\\IdeaProjects\\myjunit\\src\\copy.txt");File dest = new File("C:\\Users\\Han\\IdeaProjects\\myjunit\\src\\a.txt");FileInputStream fis = new FileInputStream(src);FileOutputStream fos = new FileOutputStream(dest);int b;while((b = fis.read()) != -1) {fos.write(b);}fos.close();fis.close();}}
运行结果:

扩展:

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

注解:

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

注释和注解的区别:

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

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

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

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

作用:

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

Java已提供的注解:

        @Override:表示重写的方法

        @Deprecated:表示已过时的方法

        @SuppressWarnings("all"):压制所有警告信息(黄色波浪线)

自定义注解方法:

特殊属性:

        value:

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

代码演示:

java">//注解的定义
public @interface Anno2 {public String value();public int age() default 23;
}//注解的使用
@Anno2("123")
public class AnnoDemo2 {@Anno2("123")public void method(){}
}

元注解:

        可以写在注解上面的注解

        @Target :指定注解能在哪里使用

        @Retention :可以理解为保留时间(生命周期)


http://www.ppmy.cn/ops/45039.html

相关文章

第十三节:带你梳理Vue2 : watch侦听器

官方解释:> 观察 Vue 实例变化的一个表达式或计算属性函数。回调函数得到的参数为新值和旧值。表达式只接受监督的键路径。对于更复杂的表达式&#xff0c;用一个函数取代<br/>## 1. 侦听器的基本使用侦听器可以监听data对象属性或者计算属性的变化watch是观察属性的…

电脑同时配置两个版本mysql数据库常见问题

1.配置时&#xff0c;要把bin中的mysql.exe和mysqld.exe 改个名字&#xff0c;不然两个版本会重复&#xff0c;当然&#xff0c;在初始化数据库的时候&#xff0c;如果时57版本的&#xff0c;就用mysql57(已经改名的)和mysqld57 代替 mysql 和 mysqld 例如 mysql -u root -p …

Unix环境高级编程--8-进程控制---8.1-8.2进程标识-8.3fork函数-8.4 vfork函数

1、进程控制几个过程 创建进程--》执行进程---》终止进程 2、进程标识 &#xff08;1&#xff09;专用进程&#xff1a;ID为0的进程是调度进程&#xff0c;常常被称为交换进程&#xff0c;也称为系统进程&#xff1b; ID为1通常是init进程&#xff0c;在自举结束时由内核调用…

轧钢测径仪分析软件,四大图表带来产线新视角!

轧钢测径仪是智能化检测设备&#xff0c;除了测径仪主体外&#xff0c;还配有测控软件系统&#xff0c;从这里可对测径仪进行各种设置&#xff0c;亦可从此观测到测径仪获得的各种信息&#xff0c;如检测信息、分析图表、计算尺寸、历史数据等。而从测径仪获得的图表信息主要有…

leetcode-顺时针旋转矩阵-111

题目要求 思路 1.假设现在有一个矩阵 123 456 789 2.我们可以根据19这个对角线将数据进行交换&#xff0c;得到矩阵 147 258 369 3.然后将矩阵每一行的数据再翻转&#xff0c;得到矩阵 741 852 963 代码实现 class Solution { public:vector<vector<int> > rot…

Web基础与HTTP协议

域名概念 1、网络是基于 TCP/IP 协议进行通讯和连接的&#xff0c;每一台主机都有一个唯一的标识&#xff08;固定的IP地址&#xff09;&#xff0c;用以区别在网络上成千上万个用户和计算机。网络在区分所有与之相连的主机和网络时&#xff0c;均采用一种唯一、通用的地址格式…

YOLO-10更快、更强

YOLO-10简介 主要贡献&#xff1a; 无NMS的一致双分配 YOLOv10提出了一种通过双标签分配而不用非极大值抑制NMS的策略。这种方法结合了一对多和一对一分配策略的优势&#xff0c;提高了效率并保持了性能。 高效的网络设计 轻量化分类头&#xff1a;在不显著影响性能的情况下&a…

《微服务王国的守护者:Spring Cloud Dubbo的奇幻冒险》

5. 经典问题与解决方案 5.3 服务追踪与链路监控 在微服务架构的广袤宇宙中&#xff0c;服务间的调用关系错综复杂&#xff0c;如同一张庞大的星系网络。当一个请求穿越这个星系&#xff0c;经过多个服务节点时&#xff0c;如何追踪它的路径&#xff0c;如何监控整个链路的健康…