[Java学习日记]日志、类加载器、XML、DTD与schema、XML解析、XPath、单元测试、Assert、BeforeAfter、注解、自定义注解、注解案例

这篇具有很好参考价值的文章主要介绍了[Java学习日记]日志、类加载器、XML、DTD与schema、XML解析、XPath、单元测试、Assert、BeforeAfter、注解、自定义注解、注解案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

下面的案例中只是做一个简单的了解,不做深入理解啦

目录

一.使用Logback写日志

二.类加载器

三.XML

四.XML编写规定:DTD与schema

五.XML解析

六.XPath

七.单元测试

七.Assert(断言):检验方法结果

八.使用before与after注解备份与还原数据

九.注解

十.自定义注解

十一.注解案例:用注解模拟JUnit


使用到的部分jar包版本如下:

[Java学习日记]日志、类加载器、XML、DTD与schema、XML解析、XPath、单元测试、Assert、BeforeAfter、注解、自定义注解、注解案例,JAVA黑马程序员笔记分享,java,学习,xml

 文章来源地址https://www.toymoban.com/news/detail-766853.html

 

一.使用Logback写日志

使用Logback写日志
把输出语句保存到文件当中
接口规范:Commons Logging(JCL)与Simple Logging Facade for java(slf4j)
日志实现框架:JUL(Java自带)、log4j、Logback(现在学习的,基于slf4j)
在使用Logger前应该做的准备工作有哪些?
1.需要导入的jar包:slf4j(规范)logback-core(核心)logback-classic(实现了完整的slf4j)logback-access(与汤猫服务器继承,提供了日志访问功能)
2.将配置文件logback.xml拷贝到src目录下

在测试类中如何使用logback产生日志文件?
1.通过LoggerFactory类的静态方法getLogger,传入本类对象创建Logger对象
2.通过Logger的info(或者其他方法记录信息)写入日志信息

配置文件:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration>
    <!-- appender标签用于设置输出位置与输出格式 -->
    <!-- 控制台输出,CONSOLE表示可以输出到控制台 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--可以改为error-->
        <target>System.out</target>
        <encoder charset="UTF-8">
            <!-- 输出日志记录格式 %d是日期  level表示日志级别  c表示当前操作的类  thread是线程名  %msg%n是显示消息加换行 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%c] [%thread] : %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 输出文件日志 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder charset="UTF-8">
            <pattern>%d{yyyy-MM-dd HH:mm:ss} : %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志输出路径,每天产生一个文件-->
            <fileNamePattern>D:/IDEACode/demo1/JAVA基础/src/Day36/MyLog/data%d{yyyy-MMdd}.log</fileNamePattern>
        </rollingPolicy>
    </appender>

    <!--
    level设置日志输出级别   ref标识输出位置,表示可以输出到控制台与File文件
    All表示全打印,OFF表示全部不打印(也可以用来关闭日志)
    一般写INFO与DEBUG,高于这个级别的,比如ERROR也会输出
    -->
    <root level="All">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</configuration>
public class Demo361Logback {
    final static Logger LOGGER = LoggerFactory.getLogger("Demo361Logback.class");
    public static void main(String[] args) {
        LOGGER.info("SunCoya学习日志");
    }
}

 

[Java学习日记]日志、类加载器、XML、DTD与schema、XML解析、XPath、单元测试、Assert、BeforeAfter、注解、自定义注解、注解案例,JAVA黑马程序员笔记分享,java,学习,xml 

 


 

二.类加载器

类加载器:把字节码class文件搬运到虚拟机里面

类加载时机-用到才加载
1.创建对象 2.调用静态方法 3.访问静态变量 4.使用反射创建class对象 5.初始化子类 6.java.exe

类加载过程
加载:
    通过全限定名获取定义此类的二进制流
    把静态存储结构转化为运行时数据结构
    加载完毕则创建一个class对象
连接:
    验证:检查信息有没有安全隐患
    准备:为静态变量初始化值—默认
    解析:加载把引用型变量需要用到的类,把符号引用变为直接引用
初始化:
    初始化静态变量:变为被复制的值

加载器分类
所有加载请求都会被送到最顶层的启动类加载器,然后往下送,看那个加载器能加载
启动类加载器:虚拟机内置类加载器
平台类加载器:加载JDK特殊模块
系统类加载器:加载用户类路径上所指定的类库
自定义加载器
public class Demo362ClassLoader {
    final static String FILE_STR = "Day35_Reflect_DynamicAgent\\message.properties";
    public static void main(String[] args) throws IOException {
        //获得系统类加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        ClassLoader platformClassLoader = systemClassLoader.getParent();
        ClassLoader bootStrapClassLoader = platformClassLoader.getParent();
        System.out.println(systemClassLoader);
        System.out.println(platformClassLoader);
        System.out.println(bootStrapClassLoader);

        //加载某一个资源文件:只能设置本模块中的路径
        InputStream stream = systemClassLoader.getResourceAsStream(FILE_STR);
        Properties properties = new Properties();
        properties.load(stream);
        System.out.println(properties);
        stream.close();
    }
}

 [Java学习日记]日志、类加载器、XML、DTD与schema、XML解析、XPath、单元测试、Assert、BeforeAfter、注解、自定义注解、注解案例,JAVA黑马程序员笔记分享,java,学习,xml

 


 

三.XML

XML(EXtensible markup language,可扩展(标签名字随便写)的标记性语言)
一般用来保存配置文件,缺点就是解析起来比较复杂
使用properties配置文件时遇到同键多值的情况会出现问题

xml声明规则:
1.文档声明必须是第一行,声明版本号码,编码:<?xml version="1.0" encoding="UTF-8" ?>
2.标签必须要有一对<name></name>或者是不成对的标签:<name/>
3.必须要有根标签(最外面的标签),且只能有一个
4.在标签里面可以设置属性,要与标签名隔开,属性值要用引号引起来:<student id="1"><student/>
<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student id="1">
        <name>zhangsan</name>
        <age>23</age>
        <!--特殊符号-->
        <special>小于&lt; 大于&gt; 且&amp; 单引&apos; 双引&quot;</special>
        <!--使用CD快捷键加入CDATA模块-->
        <special><![CDATA[<&'">]]></special>
    </student>
</students>

 


 

四.XML编写规定:DTD与schema

DTD(Document Type Definition):约束文档,后缀必须是.dtd

<!ELEMENT 书架 (书+)>
元素根标签必须叫书架,书架里面的元素必须是书,书能写多个
<!ELEMENT 书 (书名,作者,售价)>
书里面有三个子标签
<!ELEMENT 书名 (#PCDATA)>
代表里面的元素只能是文本数据, 缺点就是不能限定数据类型

而schema可以约束具体数类型,约束能力更加强大,其本身也是一个xml文件,也受到其他xml文件的约束
编写schema约束文档,后缀名必须是xsd

dtd文件:

<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

 chema文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!--xmlns:当前schema文件被谁约束 targetNamespace:地址名字-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.itcast.cn/"
        elementFormDefault="qualified">
    <xs:element name="书架">
        <xs:complexType>
            <xs:sequence maxOccurs="unbounded">
                <xs:element name="书">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="书名" type="xs:string"/>
                            <xs:element name="作者" type="xs:string"/>
                            <xs:element name="售价" type="xs:double"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
引入DTD:
1.引入本地:<!DOCTYPE 根元素名 SYSTEM 'DTD文件的路径'>
2.内部引入:<!DOCTYPE 根元素名称[dtd文件内容]>
3.引入网络:<!DOCTYPE 根元素名称 PUBLIC "DTD文件名称" "DTD文档的URL"

 XML导入DTD:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 书架 SYSTEM 'book.dtd'>
<!--引入之后直接左尖括号就能生成-->
<书架>
    <书>
        <书名>Java从入门到起飞</书名>
        <作者>阿玮</作者>
        <售价>100w</售价>
    </书>
    <书>
        <书名>Java算法真经</书名>
        <作者>????</作者>
        <售价>100w</售价>
    </书>
</书架>

 


 

五.XML解析

使用dom4j.jar去解析xml文档
SAX解析(Simple API for XML):逐行读取,只能查不能改,但是查询效率高
DOM解析:整体加载到内存,形成树型结构,可查可改,我们学习的也是DOM解析工具
在dom思想中:attribute是属性
public class Demo363XMLoad {
    final static String FILE_STR = "JAVA基础\\src\\Day36\\MyXML\\students2.xml";
    public static void main(String[] args) throws DocumentException {
        System.out.println("1.创建SAXReader对象");
        SAXReader saxReader = new SAXReader();
        System.out.println("2.调用saxReader的read方法,传入需要读取的文件,获取dom对象");
        Document document = saxReader.read(new File(FILE_STR));
        System.out.println(document);
        System.out.println("3.通过dom获取根标签对象");
        Element rootElement = document.getRootElement();
        System.out.println(rootElement.getName());
        System.out.println("4.通过根标签获取子标签,传入参数代表限制标签名");
        List<Element> elements = rootElement.elements();
        for (Element element : elements)System.out.println(element.getName());
        System.out.println("5.通过标签获取属性,内容,把数据放到集合中");
        ArrayList<Student> arrayList = new ArrayList<>();
        for (Element element : elements) {
            //获取标签属性
            Attribute attribute = element.attribute("id");
            String id = attribute.getText();
            //获取标签
            String name = element.element("name").getText();
            String age = element.element("age").getText();
            arrayList.add(new Student(Integer.parseInt(id),name,Integer.parseInt(age)));
        }
        System.out.println(arrayList);
    }
}
public class Student {
    private int id;
    private String name;
    private int age;
    public Student() {
    }
    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String toString() {
        return "Student{id = " + id + ", name = " + name + ", age = " + age + "}";
    }
}

 

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student id="1">
        <name>zhangsan</name>
        <age>23</age>
    </student>
    <student id="2">
        <name>lisi</name>
        <age>24</age>
    </student>
    <student id="3">
        <name>wangwu</name>
        <age>25</age>
    </student>
</students>

[Java学习日记]日志、类加载器、XML、DTD与schema、XML解析、XPath、单元测试、Assert、BeforeAfter、注解、自定义注解、注解案例,JAVA黑马程序员笔记分享,java,学习,xml 


 

六.XPath

Xpath技术:获取xml文档中的单个元素,依赖于dom4j
其提供了比较独特的路径思想:使用路径来定位元素节点或者是属性节点
导入jaxen.jar包(暂时未用到)
public class Demo364XPath {
    public static void main(String[] args) throws DocumentException {
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(new File(Demo363XMLoad.FILE_STR));
        System.out.println("1.获取到DOM对象之后使用selectNodes方法获取节点元素");
        System.out.println("2.绝对路径:从头开始一级一级往下,可以检索多个符合这一条路径的元素,用多个/表示");
        List<Node> nodes = document.selectNodes("/students/student/name");
        for (Node node : nodes) {System.out.println(node.getText());}

        System.out.println("如果是获取单个标签,则得到第一个");
        Node node = document.selectSingleNode("students/student/name");
        System.out.println(node.getText());

        System.out.println("3.相对路径:需要找到一个当前节点,用.表示");
        Element rootElement = document.getRootElement();
        nodes = rootElement.selectNodes("./student/name");
        for (Node node1 : nodes) {System.out.println(node1.getText()); }

        System.out.println("""
                4.全文检索:直接搜索元素名,使用//,比如我的案例中可以直接使用//name
                下面的写法则是搜索所有students路径下的name,不必严格一级一级往下
                也可以写//student/name:表示搜索到的name一定要在student下一级
                也就是说有两条杠就可以随意玩,只有一条杠就需要遵守层级规则                   
                """);
        nodes = document.selectNodes("//students//name");
        for (Node node1 : nodes) {System.out.println(node1.getText()); }

        System.out.println("5.属性检索,使用//@属性名检索所有的属性");
        nodes = document.selectNodes("//@id");
        for (Node node1 : nodes) { System.out.println(node1.getText()); }

        System.out.println("6.通过特定属性检索标签:在标签后添加[@属性名]");
        nodes=document.selectNodes("//student[@id]");
        for (Node node1 : nodes) { System.out.println(node1.getName()); }

        System.out.println("7.通过固定属性检索标签,在上面的案例基础上给属性赋值即可,下面字符串中只能用单引");
        nodes = document.selectNodes("//student[@id='1']");
        for (Node node1 : nodes) { System.out.println(node1.getName()); }
    }
}

[Java学习日记]日志、类加载器、XML、DTD与schema、XML解析、XPath、单元测试、Assert、BeforeAfter、注解、自定义注解、注解案例,JAVA黑马程序员笔记分享,java,学习,xml 

 


 

七.单元测试

单元测试:针对Java中的方法的测试
编写测试方法:public void method(),一定要是非静态方法,在测试方法上使用@Test注解
左边的External Libraries中出现JUnit4
点击类名左边的绿色箭头可测试多个方法
public class Demo365JUnitTest {
    @Test
    public void method1(){
        System.out.println("测试方法一");
    }
    @Test
    public void method2(){
        System.out.println("测试方法二");
    }
    @Test
    public void method3(){
        System.out.println("测试方法三");
    }
}

[Java学习日记]日志、类加载器、XML、DTD与schema、XML解析、XPath、单元测试、Assert、BeforeAfter、注解、自定义注解、注解案例,JAVA黑马程序员笔记分享,java,学习,xml 


 

七.Assert(断言):检验方法结果

public class Demo366JUnitAssert {
    @Test
    public void method1(){
        Demo366JUnitAssert jt = new Demo366JUnitAssert();
        int res = jt.add(1, 1);
        //参数一:两个结果不一样的提示消息
        Assert.assertEquals("这个方法出错了",2,res);
    }
    public int add(int a,int b){
        return a*b;
    }
}

[Java学习日记]日志、类加载器、XML、DTD与schema、XML解析、XPath、单元测试、Assert、BeforeAfter、注解、自定义注解、注解案例,JAVA黑马程序员笔记分享,java,学习,xml 

 


 

八.使用before与after注解备份与还原数据

public class Demo367BeforeAfter {
    //在测试单元中,相对路径是在当前模块中,和类加载器一样
    final static String FILE_STR = "src\\Day36\\MyLog\\a.txt";
    final static String FILE_COPY ="src\\Day36\\MyLog\\aCopy.txt";
    @Test
    public void test(){
        boolean b = new File(FILE_STR).delete();
        Assert.assertTrue(b);
        b=new File(FILE_STR).exists();
        Assert.assertFalse(b);
        System.out.println("Test,在这个方法里面做测试");
    }
    @Before
    public void before(){
        FileUtil.copy(new File(FILE_STR),new File(FILE_COPY),false);
        System.out.println("before,使用这个方法初始化数据,比如数据的删除");

    }
    @After
    public void after(){
        FileUtil.copy(new File(FILE_COPY),new File(FILE_STR),false);
        new File(FILE_COPY).delete();
        System.out.println("after,使用这个方法还原数据,删除备份数据");
    }
}

[Java学习日记]日志、类加载器、XML、DTD与schema、XML解析、XPath、单元测试、Assert、BeforeAfter、注解、自定义注解、注解案例,JAVA黑马程序员笔记分享,java,学习,xml 

 


 

九.注解

注解主要是给编译器看的,用来检测
@Deprecated:表示方法已经过时:也会给你提示替代方案
@SuppressWarnings("all"):压制(去除)警告
@SuppressWarnings("all")
public class Demo368Annotation {
    public static void main(String[] args) {
        int a;
    }
    @Deprecated
    public static void method(){
        System.out.println("haihai");
    }
}

 


 

十.自定义注解

自定义注解:结合反射使用
能在变量上使用,也能在方法中使用
public @interface MyAnno {
    //可以不写默认值
    public String name()default "???";
    public int age();
}
public class Demo369MyAnno {
    //如果注解中只有一个属性,就可以只写值,如压制警告
    @MyAnno(name = "啊?",age=20)
    String aaa;
    String bbb;
    @MyAnno(name = "啊?",age=20)
    public void method(){
        System.out.println("方法一");
    }
    public void method2(){
        System.out.println("方法二");
    }
}

 


 

十一.注解案例:用注解模拟JUnit

元注解:注解的注解
@Target:约束注解使用的地方
@Retention:申明注解的生命周期
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {}
public class Main {
    public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, IllegalAccessException {
        Class<?> aClass = Class.forName("Day36.Demo3610.Main");
        //补个对象
        Main main = new Main();
        Method[] methods = aClass.getMethods();
        for (Method method : methods) {
            method.setAccessible(true);
            if (method.isAnnotationPresent(MyTest.class)){
                method.invoke(main);
            }
        }
    }

    @MyTest
    public void method1(){
        System.out.println("方法一");
    }
    @MyTest
    public void method2(){
        System.out.println("方法二");
    }
    public void method3(){
        System.out.println("方法三");
    }
}

到了这里,关于[Java学习日记]日志、类加载器、XML、DTD与schema、XML解析、XPath、单元测试、Assert、BeforeAfter、注解、自定义注解、注解案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python爬虫学习笔记(四)————XPath解析

    目录 0.xpath最新下载地址和安装教程 1.xpath安装 2.xpath基本使用 3.xpath基本语法 4.实例 (1)xpath解析本地文件  (2)xpath解析服务器响应的数据 ①获取百度网站的“百度一下”四个字 ②获取站长素材网站情侣图片前十页的图片 0.xpath最新下载地址和安装教程 https://blog.csdn.net/

    2024年02月16日
    浏览(50)
  • xml schema中的all元素

    xml schema中的all元素表示其中的子元素可以按照任何顺序出现,每个元素可以出现0次或者1次。 https://www.w3.org/TR/xmlschema-1/#element-all maxOccurs的默认值是1,minOccurs 的默认值是1。

    2024年02月07日
    浏览(41)
  • MyCat配置文件schema.xml讲解

    1.1 schema标签 如果checkSQLschema配置的为false,那么执行DB01.TB_ORDER时就会报错,必须用use切换逻辑库以后才能进行查询。 sqlMaxLimit如果未指定limit进行查询,列表查询模式默认为100,最多只查询100条。因为用mycat后默认数据量特别大,查询全表数据是十分耗费性能的。 要拆分的表我

    2024年02月13日
    浏览(32)
  • Generate XML or JSON Schemas

    XMLSpy 2024 adds an AI Assistant to help developers create schemas, instance documents, and sample data from natural language prompts. Altova XMLSpy is a JSON and XML editor for modeling, editing, transforming and debugging related technologies. It includes a graphical schema designer, code generation, file converters, debuggers and profilers for working wit

    2024年02月05日
    浏览(40)
  • 【Spring Boot学习】日志文件,Spring Boot也会写日记了,这些事你知道嘛 ? ? ?

    前言: 大家好,我是 良辰丫 ,在上一篇文章中我们已经学习了Spring Boot的配置,接下来我们要学习一些日志相关的东西,什么是日志呢?我们慢慢往下看.💌💌💌 🧑个人主页:良辰针不戳 📖所属专栏:javaEE进阶篇之框架学习 🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些

    2024年02月08日
    浏览(48)
  • XML-BEANS compiled schema: Could not locate compiled schema resource 异常处理

    使用poi5.2.2生成ppt,生成堆叠图,设置值时抛出异常 XML-BEANS compiled schema: Could not locate compiled schema resource org/apache/poi/schemas/ooxml/system/ooxml/stoverlappercent872etype.xsb (org.apache.poi.schemas.ooxml.system.ooxml.stoverlappercent872etype) - code 0 异常显示缺少stoverlappercent872etype.xsb文件,检查poi-ooxml包和

    2024年02月13日
    浏览(39)
  • Java Logback日志框架概述及logback.xml详解

    日志技术具备的优势 可以将系统执行的信息选择性的记录到指定的位置(控制台、文件中、数据库中)。· 可以随时以开关的形式控制是否记录日志,无需修改源代码。 日志体系结构 Logback日志框架 Logback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好 Logback是基于

    2024年02月10日
    浏览(64)
  • windows server 的日志手动筛选xml如何学习编写

    1、Windows Event Log:Windows Event Log 是 Windows Server 操作系统提供的一种记录系统事件的机制,它可以记录操作系统、应用程序、安全、系统和其他类型的事件。 2、Event Viewer:Event Viewer 是 Windows 操作系统提供的一个工具,它可以用来查看 Windows Event Log 中记录的事件。 3、Event ID:

    2023年04月20日
    浏览(28)
  • 探索XPath:XML中的数据定位神器

    摘要:XPath是一种强大的查询语言,专门用于在XML文档中定位和选择节点。类似于SQL在关系型数据库中的作用,XPath在XML处理中扮演着重要的角色。本文将深入探索XPath的基本概念、语法和用法,并通过与SQL的类比帮助读者更好地理解XPath的优势和应用场景。 XPath是一种用于在

    2024年02月14日
    浏览(37)
  • java解析xml文件

    MyContentHandler类继承自DefaultHandler,是一个自定义的内容处理器。在该类中重写了startElement()、endElement()和characters()方法,以处理XML解析的不同事件。

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包