Java基础——方法引用、单元测试、XML、注解

一、方法引用

方法引用是JDK8开始出现,主要的作用,是对Lambda表达式进行进一步的简化

方法引用使用一对冒号::

可以使语言的构造更紧凑简洁,减少冗余代码

注:只能是一个参数的时候

java 复制代码
public class Main {
    public static void main(String[] args) {
        ArrayList<String> letter = new ArrayList<>();
        Collections.addAll(letter,"A","B","C");
        letter.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        //鼠标放在黄色位置ALt+Enter变成下面的应用
        letter.forEach(s->System.out.println(s));
        letter.forEach(System.out::println);
       //静态方法引用,类名引用
        letter.forEach(A::method);
        //非静态方法引用,对象名引用方法
        final A a = new A();
        letter.forEach(a::method2);
    }

}
class A{
    public static void method(String e){
        System.out.println(e);
    }
    public void method2(String e){
        System.out.println(e);
    }
}

二、单元测试

就是针对最小的功能单元(方法),编写测试代码对其正确性进行测试。

**JUnit:**最流行的Java测试框架之一,提供了一些功能,方便程序进行单元测试(第三方公司提供)。

  1. JUnit单元测试是做什么的?

测试类中方法的正确性

  1. JUnit单元测试的优点是什么?

可以选择执行一 一个测试方法,或执行全部测试方法

可以自动生成测试报告 (通过:绿色,失败:红色)

一个测试方法执行失败, 不会影响其它测试方法

  1. JUnit单元测试的命名规范?

类: xxxxTest (规范)

方法: public void xxxx(){...} (规定)

JUnit安装方法

第一步:在方法上面写@Text 然后 Alt + Enter

第二步:选择第一个点一下,下载一下

第三步:下载完成后,在@Text 然后 Alt + Enter 导入

导入完成后,左侧有个绿色的运行箭头。

三、XML

可扩展标记语言(英语: Extensible Markup Language, 简称: XML) 是一种标记语言

作用: 常用于当做配置文件存储数据 ,适用于存储一对多的标记

.properties文件是用于存储一对一的标记

语法:

1.创建一个XML类型的文件,要求文件的后缀必须使用xml,如he1lo_ world. xml

2.编写文档声明(必须是第一行第一-列)

<?xml version="1. 0" encoding="UTF-8" ?>

version: 该属性是必须存在的

encoding: 该属性不是必须的

standalone: 该属性不是必须的,描述XML 文件是否依赖其他的xm1文件,取值为

yes/no

3.编写根标签(必须存在一个根标签, 有且只能有一个)标签必须成对出现

<student> </student>

4.特殊的标签可以不成对,但是必须有结束标记<address/>

5.标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来

<student id="1"> </student>

6.标签需要正确的嵌套

7.XML文件中可以定义注释信息: <!- 注释内容-->

8.XML文件中可以存在以下特殊字符

9.XML文件中可以存在CDATA区: <![CDATA[ ..内... ]>

XML 复制代码
<?xml version="1.0" encoding="utf-8" ?>
<Students>
    <Student id="1" name="北京">
        <name>张三</name>
        <age>23</age>
        <address>&lt;北京&gt;</address>
        <content><![CDATA[<哈哈>]]></content>
    </Student>
</Students>
XML 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<Citys>
    <city name="北京">
        <area>海淀区</area>
        <area>东城区</area>
        <area>西城区</area>
    </city>
</Citys>

约束:(了解)

用来限定xml文件中可使用的标签以及属性
约束分类:

  1. dtd约束

步骤:

1)创建一一个文件,这个文件的后缀名为. dtd

2)看xm1文件中使用了哪些元素公<!ELEMENT>可以定义元素

<!ELEMENT persons (person)> //标签名必须叫persons要有子标签person

<! ELEMENT person (name, age)>//子标签person中有name, age标签

<!ELEMENT name ( #PCDATA)>//name标签内是文本,age同理

< !ELEMENT age (#PCDATA)>

XML 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!--第一种引入-->
<!--<!DOCTYPE persons SYSTEM 'stu.dtd'>-->
<!--第二种引入-->
<!--<!DOCTYPE persons [
        <!ELEMENT persons (person)>
        <!ELEMENT person (name, age)>
        <!ELEMENT name ( #PCDATA)>
        <!ELEMENT age (#PCDATA)>]>-->
<!--
<persons>
    <person>
        <name>张三</name>
        <age>22</age>
    </person>
</persons>-->
<!--第三种引入-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <databaseIdProvider type=""></databaseIdProvider>
</configuration>

3)引入dtd约束

本地引入:<!DOCTYPE根元素名称 SYSTEM 'DTD文件的路径'>

内部引入:< !DOCTYPE根元素名称 [ dtd文件内容]>

网络引入:< !DOCTYPE根元素的名称 PUBLIC "DTD文件名称" "DTD文档的URL">

  1. schema约束

schema 和 dtd 的区别

1)schema约束文件也是一个xm1文件,符合xm1的语法,这个文件的后缀名. xsd

2)一个xm1中可以引用多个schema约束文件,多个schema使用名称空间区分 (名称空间类

似于java包名)

3)dtd里面元素类型的取值比较单一常见的是PCDATA类型, 但是在schema里面可以支持很

多个数据类型

4)schema 语法更加的复杂

步骤:

1)创建一个文件,这个文件的后缀名为.xsd

2)定义文档声明

3)schema文件的根标签为: <schema>

4)在<schema>中定义属性:

xmlns=http:/ /wwW. w3. org/ 2001/XMLSchema

5)在<schema>中定义属性:

targetNamespace =唯一-的ur l地址,指定当前这个schema文件的名称空间

6)在<schema>中定义属性:

elementFormDefault= " qualified",表示当前schema文件是一个质量良好的文件

7)通过element定义元素

8)判断当前元素是简单元素还是复杂元素

XML 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://mstu.com"
        elementFormDefault="qualified"
>
    <element name="students">
        <complexType>
<!--            顺序这指定最大子标签数量-->
            <sequence maxOccurs="unbounded">
                <element name="student" >
                    <complexType>
                        <sequence>
                            <element name="name" type="string"></element>
                            <element name="age" type="int"></element>
                        </sequence>
<!--                        给谁加属性就在那个标签里添加attribute-->
                        <attribute name="id" type="string" use="required"/>
                    </complexType>
                </element>
            </sequence>
        </complexType>
    </element>
</schema>
XML 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!--可以引入多份-->
<students xmlns:xi="http://www.w3.org/2001/XMLSchema-instance"
          xmln="http://mstu.com"
          xi:schemalocation="http://mstu.com mstu.xsd">
    <student>
        <name>张三</name>
        <age>23</age>
    </student>
</students>

XML解析
SAX 解析: 不会把整体的xm1文件都加载到内存,而是从上往下逐行进行扫描。

缺点: 只能读取,不能添加,不能删除。

优点: 因为他是逐行描不需要把整体的xmi文件都加载到内存,所以他可以解析比较大

的xml文件。
DOM 解析: 会把整体的xml文件都加载到内存,形成-个树形结构, 我们可以通过这个树形结构去

解析xm1文件。

优点: 可以读取,可以添加,可以删除,可以做任何事情。

**缺点:**需要xm1文件全部加载到内存,所以不能解析非常大的xml文件。

解析框架

|--------|-----------------------------------------------------------------------------------------------------|
| 名称 | 说明 |
| JAXP | SUN公司提供的一套XML的解析的API(不好用) |
| JDOM | JDOM是一个开源项目, 它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。 |
| Dom4j | 是JDOM的升级品,用来读写XML文件的。具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件, Hibernate也用它来读写配置文件。 |
| jsoup | 功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便 |

Dom4j的使用

  1. 导入dom4j-1.6.1.jar包

2.关联要解析的xml文件, 获取Document对象

  1. 解析

获取跟标签

|--------------------------|---------|
| 方法名 | 说明 |
| Element getRootElement() | 获得根元素对象 |

获取子标签

|----------------------------------------|---------------------------------|
| 方法名 | 说明 |
| List<Element> elements() | 得到当前元素下所有子元素 |
| List< Element> elements(String name) | 得到当前元素下指定名字的子元素返回集合 |
| Element element(String name) | 得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个 |
| String getName() | 得到元素名字 |
| String attributeValue(String name) | 通过属性名直接得到属性值 |
| String elementText(子 元素名) | 得到指定名称的子元素的文本 |
| String getText() | 得到文本 |

java 复制代码
public class ExplainXML {
    public static void main(String[] args) throws DocumentException {
        SAXReader saxReader = new SAXReader();
        //1.关联XML文件获取文件对象
        Document doc = saxReader.read("day19\\src\\XML\\mstu.xml");
        //2.获取根标签
        Element rootElement = doc.getRootElement();
        //3获取子标签,是个List,需要自己定义成Element属性
        List<Element> elements = rootElement.elements();
        //4.遍历子标签集合
        for (Element stuElement : elements) {
            //5获取属性
            String id = stuElement.attributeValue("id");
            System.out.println(id);
            //6获取元素和元素中的内容
            Element name = stuElement.element("name");
            Element age = stuElement.element("age");
            System.out.println(name.getText());
            System.out.println(age.getText());

        }
    }
}

四、注解

Annotation表示注解, 是JDK1 . 5的新特性。注解的主要作用:对程序进行标注。

理解: 注释是给人看的,注解是给虚拟机看的

通过注解可以给类增加额外的信息。

编译器或JVM可以根据注解来完成对应的功能
JDK中常见注解:

  1. @Override: 表示方法的重写

  2. @Deprecated: 表示修饰的方法已过时

  3. @SuppressWarnings("all"): 压制警告

自定义注解

自定义注解单独存意义不大,一般会跟反射结合起来使用

格式:

注意:在使用注解时,如果注解的属性没有给出默认值,需要手动给出
@Anno( name="张三E " )
如果数组中只有一个属性值,在使用时{ }是可以省略的

**属性类型:**基本数据类型,String,Class,注解,枚举,以上类型的一维数组

**常用位置:**类和方法上

特殊属性value:

定义注解中如果有多个属性没有赋值,使用时需要全部赋值

如果只有一个属性名字为value没有赋值,使用时直接给出值,不需要写属性名

@SuppressWarnings("a1l"):压制警告 (点进去发现就是calue属性)

**元注解:**用在注解上的注解

|------------|-----------------|
| 名称 | 说明 |
| @Target | 指定了注解能在哪里使用 |
| @Retention | 可以理解为保留时间(生命周期) |

**@Target:**用来标识注解使用的位置,如果没有使用该注解标识,则自定义的注解可以使用在任意位置 (重点看前两个)

**@Retention:**用来标识注解的生命周期(有效范围)

案例:

需求:自定义一-个注解@MyTest,用于指定类的方法上

如果类中的某个的方法.上使用了该注解,就执行该方法.

java 复制代码
@Target(ElementType.METHOD)//只能用在方法上面
@Retention(RetentionPolicy.RUNTIME)
public @interface MyText {
}
java 复制代码
public class AnnoDome {
    @MyText
    public static void print1(){
        System.out.println("print1********");
    }
    @MyText
    public static void print2(){
        System.out.println("print2********");
    }
    public static void print3(){
        System.out.println("print3********");
    }
}
java 复制代码
public class TextMain {
    public static void main(String[] args) throws Exception {
        //获取自解码文件
        Class<AnnoDome> annoDomeClass = AnnoDome.class;
        final AnnoDome annoDome = annoDomeClass.getConstructor().newInstance();
        //通过自解码文件获取所有类方法
        final Method[] methods = annoDomeClass.getMethods();
        //循环所有方法
        for (Method method : methods) {
            //判断方法上是否添加了自定义注释
            if(method.isAnnotationPresent(MyText.class)){
                method.invoke(annoDome);
            }
        }
    }
}
相关推荐
李少兄28 分钟前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
此木|西贝33 分钟前
【设计模式】原型模式
java·设计模式·原型模式
可乐加.糖1 小时前
一篇关于Netty相关的梳理总结
java·后端·网络协议·netty·信息与通信
s9123601011 小时前
rust 同时处理多个异步任务
java·数据库·rust
9号达人1 小时前
java9新特性详解与实践
java·后端·面试
cg50171 小时前
Spring Boot 的配置文件
java·linux·spring boot
啊喜拔牙1 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
anlogic2 小时前
Java基础 4.3
java·开发语言
非ban必选2 小时前
spring-ai-alibaba第七章阿里dashscope集成RedisChatMemory实现对话记忆
java·后端·spring
A旧城以西2 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea