最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中實(shí)現(xiàn)XML與JavaBean互轉(zhuǎn)的方法

 更新時(shí)間:2025年12月23日 10:05:47   作者:Jinkxs  
在現(xiàn)代軟件開(kāi)發(fā)中,數(shù)據(jù)交換是不可或缺的一環(huán),尤其是在分布式系統(tǒng)、Web 服務(wù)、微服務(wù)架構(gòu)以及不同平臺(tái)間的數(shù)據(jù)交互中,本文將深入探討 JAXB 的核心概念、使用方法及其在 JavaBean 與 XML 互轉(zhuǎn)中的應(yīng)用,需要的朋友可以參考下

在現(xiàn)代軟件開(kāi)發(fā)中,數(shù)據(jù)交換是不可或缺的一環(huán)。尤其是在分布式系統(tǒng)、Web 服務(wù)、微服務(wù)架構(gòu)以及不同平臺(tái)間的數(shù)據(jù)交互中,XML(eXtensible Markup Language)作為一種結(jié)構(gòu)化、可讀性強(qiáng)、語(yǔ)言無(wú)關(guān)的數(shù)據(jù)格式,扮演著至關(guān)重要的角色。Java 作為主流的編程語(yǔ)言,提供了多種方式來(lái)處理 XML 數(shù)據(jù)。其中,JAXB(Java Architecture for XML Binding) 是 Java 平臺(tái)提供的一個(gè)標(biāo)準(zhǔn)規(guī)范,它允許開(kāi)發(fā)者將 Java 對(duì)象與 XML 文檔之間進(jìn)行無(wú)縫轉(zhuǎn)換。通過(guò) JAXB,我們可以輕松地將 Java 對(duì)象序列化為 XML,或?qū)?XML 解析為 Java 對(duì)象,極大地簡(jiǎn)化了數(shù)據(jù)交換的復(fù)雜度。

本文將深入探討 JAXB 的核心概念、使用方法及其在 JavaBean 與 XML 互轉(zhuǎn)中的應(yīng)用。我們將從基礎(chǔ)的 JAXB 注解開(kāi)始,逐步構(gòu)建一個(gè)完整的示例,演示如何利用這些注解來(lái)精確控制 Java 對(duì)象與 XML 結(jié)構(gòu)之間的映射關(guān)系。同時(shí),我們還將討論 JAXB 的優(yōu)勢(shì)、局限性以及一些最佳實(shí)踐,幫助你更高效地在項(xiàng)目中應(yīng)用這項(xiàng)技術(shù)。

一、JAXB 簡(jiǎn)介

1.1 什么是 JAXB?

JAXB(Java Architecture for XML Binding)是 Java 平臺(tái)的一部分,它提供了一種標(biāo)準(zhǔn)的方式來(lái)處理 XML 數(shù)據(jù)。JAXB 的核心目標(biāo)是讓開(kāi)發(fā)者能夠以面向?qū)ο蟮姆绞讲僮?XML 數(shù)據(jù),而無(wú)需直接處理繁瑣的 XML 解析和生成代碼。

JAXB 通過(guò)一組注解(Annotations) 來(lái)標(biāo)記 Java 類和字段,從而定義它們與 XML 元素、屬性、文本內(nèi)容之間的映射關(guān)系。在編譯時(shí),JAXB 工具(如 xjc)可以根據(jù)這些注解生成相應(yīng)的代碼,或者在運(yùn)行時(shí),JAXB Runtime 會(huì)自動(dòng)處理 Java 對(duì)象與 XML 文檔之間的轉(zhuǎn)換。

1.2 JAXB 的核心組件

JAXB 主要由以下幾個(gè)核心組件構(gòu)成:

  • javax.xml.bind.JAXBContext:這是 JAXB 的入口點(diǎn)。它負(fù)責(zé)管理 Java 類與 XML 架構(gòu)(Schema)之間的映射關(guān)系。你需要通過(guò) JAXBContext.newInstance() 方法來(lái)創(chuàng)建一個(gè) JAXBContext 實(shí)例。
  • javax.xml.bind.Marshaller:負(fù)責(zé)將 Java 對(duì)象序列化為 XML 文檔。通過(guò) JAXBContext.createMarshaller() 獲取 Marshaller 實(shí)例,并調(diào)用其 marshal() 方法即可。
  • javax.xml.bind.Unmarshaller:負(fù)責(zé)將 XML 文檔反序列化為 Java 對(duì)象。通過(guò) JAXBContext.createUnmarshaller() 獲取 Unmarshaller 實(shí)例,并調(diào)用其 unmarshal() 方法即可。
  • javax.xml.bind.annotation.*:這是一系列用于標(biāo)記 Java 類和字段的注解,用來(lái)定義它們與 XML 元素、屬性、文本內(nèi)容的映射關(guān)系。

1.3 JAXB 的優(yōu)勢(shì)

  • 簡(jiǎn)化開(kāi)發(fā):開(kāi)發(fā)者無(wú)需手動(dòng)編寫 XML 解析和生成的代碼,只需關(guān)注業(yè)務(wù)邏輯。
  • 類型安全:通過(guò) Java 類型系統(tǒng),保證了數(shù)據(jù)的類型安全。
  • 標(biāo)準(zhǔn)化:JAXB 是 Java EE 規(guī)范的一部分,具有良好的跨平臺(tái)兼容性。
  • 靈活性:通過(guò)注解可以靈活地控制映射規(guī)則,適應(yīng)各種復(fù)雜的 XML 結(jié)構(gòu)。

思考:在處理 Web Service、配置文件、數(shù)據(jù)傳輸?shù)葓?chǎng)景時(shí),JAXB 能夠顯著減少樣板代碼,提高開(kāi)發(fā)效率。

二、環(huán)境準(zhǔn)備與依賴

2.1 JDK 版本要求

JAXB 在 JDK 6 到 JDK 8 中是作為標(biāo)準(zhǔn)庫(kù)的一部分提供的。從 JDK 9 開(kāi)始,JAXB 被移除,需要單獨(dú)引入 jaxb-apijaxb-runtime 依賴。

  • JDK 6 - JDK 8:無(wú)需額外依賴。
  • JDK 9+:需要添加 Maven 或 Gradle 依賴。

2.2 Maven 依賴(JDK 9+)

如果你使用的是 JDK 9 或更高版本,需要手動(dòng)添加 JAXB 依賴。在 pom.xml 文件中添加以下依賴:

<dependencies>
    <!-- JAXB API -->
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>

    <!-- JAXB Runtime -->
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.1</version>
    </dependency>
</dependencies>

2.3 Gradle 依賴(JDK 9+)

build.gradle 文件中添加:

dependencies {
    implementation 'javax.xml.bind:jaxb-api:2.3.1'
    implementation 'org.glassfish.jaxb:jaxb-runtime:2.3.1'
}

2.4 版本說(shuō)明

本文檔基于 JAXB 2.3.1 版本進(jìn)行講解。請(qǐng)根據(jù)你的 JDK 版本選擇合適的 JAXB 版本。對(duì)于 JDK 9+,通常推薦使用 2.3.1 或更新的版本。

三、核心概念:JAXB 注解詳解

JAXB 的強(qiáng)大之處在于其豐富的注解體系。通過(guò)這些注解,我們可以精確控制 Java 對(duì)象如何映射到 XML 結(jié)構(gòu)。

3.1 基礎(chǔ)注解

@XmlRootElement

這是最常用的注解,用于標(biāo)識(shí)一個(gè) Java 類對(duì)應(yīng)于 XML 文檔的根元素。

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "person") // 指定 XML 根元素名為 person
public class Person {
    // ...
}

@XmlElement

用于將 Java 類的字段或方法映射到 XML 元素。

import javax.xml.bind.annotation.XmlElement;

public class Person {
    private String name;

    @XmlElement(name = "full_name") // 映射到 XML 元素 <full_name>
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

@XmlAttribute

用于將 Java 類的字段或方法映射到 XML 屬性。

import javax.xml.bind.annotation.XmlAttribute;

public class Person {
    private String id;

    @XmlAttribute(name = "id") // 映射到 XML 屬性 id
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

3.2 高級(jí)注解

@XmlAccessorType

控制哪些字段或?qū)傩詴?huì)被 JAXB 處理。默認(rèn)是 PUBLIC_MEMBER

import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;

@XmlAccessorType(XmlAccessType.FIELD) // 只處理字段
public class Person {
    private String name; // 直接映射到 XML 元素
}

@XmlType

定義 Java 類的屬性順序和 XML 類型。

import javax.xml.bind.annotation.XmlType;

@XmlType(propOrder = {"name", "age"}) // 指定 XML 元素的順序
public class Person {
    private String name;
    private int age;
}

@XmlTransient

標(biāo)記一個(gè)字段或方法不會(huì)被序列化或反序列化。

import javax.xml.bind.annotation.XmlTransient;

public class Person {
    private String password; // 不參與 XML 序列化

    @XmlTransient
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

@XmlEnum&@XmlEnumValue

用于枚舉類的映射。

import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlEnumValue;

@XmlEnum
public enum Status {
    @XmlEnumValue("active")
    ACTIVE,

    @XmlEnumValue("inactive")
    INACTIVE
}

// 對(duì)應(yīng)的 XML 可能是 <status>active</status> 或 <status>inactive</status>

@XmlJavaTypeAdapter

用于自定義類型轉(zhuǎn)換。

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

public class Person {
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date birthDate;
    // ...
}

@XmlSeeAlso

用于指定子類,當(dāng)需要處理繼承關(guān)系時(shí)。

import javax.xml.bind.annotation.XmlSeeAlso;

@XmlSeeAlso({Employee.class}) // 指定子類
@XmlRootElement(name = "person")
public class Person {
    // ...
}

@XmlElements&@XmlElementRef

用于處理多個(gè)可能的元素。

import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlElementRef;

public class Person {
    @XmlElements({
        @XmlElement(name = "address", type = Address.class),
        @XmlElement(name = "location", type = Location.class)
    })
    private Object contactInfo; // 可以是 Address 或 Location
}

@XmlAnyElement

用于處理未知的 XML 元素。

import javax.xml.bind.annotation.XmlAnyElement;

public class Person {
    @XmlAnyElement
    private List<Element> unknownElements; // 存儲(chǔ)未知元素
}

提示:熟悉這些注解是掌握 JAXB 的關(guān)鍵。每種注解都有其特定的用途和適用場(chǎng)景,正確使用可以極大簡(jiǎn)化 XML 處理邏輯。

四、Java Bean 定義

為了演示 JAXB 的功能,我們需要定義一些 Java Bean 類。這些類將代表我們想要序列化/反序列化的數(shù)據(jù)結(jié)構(gòu)。

4.1 基礎(chǔ)實(shí)體類:Person

package com.example.xml.model;

import javax.xml.bind.annotation.*;
import java.util.Date;

/**
 * 人員信息實(shí)體類
 */
@XmlRootElement(name = "person") // 指定 XML 根元素名為 person
@XmlAccessorType(XmlAccessType.FIELD) // 指定使用字段進(jìn)行映射
@XmlType(propOrder = {"id", "name", "email", "birthDate", "address", "status"}) // 指定 XML 元素順序
public class Person {

    @XmlAttribute(name = "id") // 映射為 XML 屬性 id
    private Long id;

    @XmlElement(name = "full_name") // 映射為 XML 元素 <full_name>
    private String name;

    @XmlElement // 映射為 XML 元素 <email>
    private String email;

    @XmlElement(name = "birth_date") // 映射為 XML 元素 <birth_date>
    private Date birthDate;

    @XmlElement // 映射為 XML 元素 <address>
    private Address address;

    @XmlElement // 映射為 XML 元素 <status>
    private String status;

    // 構(gòu)造函數(shù)
    public Person() {}

    public Person(Long id, String name, String email, Date birthDate, Address address, String status) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.birthDate = birthDate;
        this.address = address;
        this.status = status;
    }

    // Getter 和 Setter 方法
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", birthDate=" + birthDate +
                ", address=" + address +
                ", status='" + status + '\'' +
                '}';
    }
}

4.2 嵌套實(shí)體類:Address

package com.example.xml.model;

import javax.xml.bind.annotation.*;

/**
 * 地址信息實(shí)體類
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {"street", "city", "zipCode", "country"})
public class Address {

    @XmlElement // 映射為 XML 元素 <street>
    private String street;

    @XmlElement // 映射為 XML 元素 <city>
    private String city;

    @XmlElement(name = "postal_code") // 映射為 XML 元素 <postal_code>
    private String zipCode;

    @XmlElement // 映射為 XML 元素 <country>
    private String country;

    // 構(gòu)造函數(shù)
    public Address() {}

    public Address(String street, String city, String zipCode, String country) {
        this.street = street;
        this.city = city;
        this.zipCode = zipCode;
        this.country = country;
    }

    // Getter 和 Setter 方法
    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getZipCode() {
        return zipCode;
    }

    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    @Override
    public String toString() {
        return "Address{" +
                "street='" + street + '\'' +
                ", city='" + city + '\'' +
                ", zipCode='" + zipCode + '\'' +
                ", country='" + country + '\'' +
                '}';
    }
}

4.3 枚舉類:Status

package com.example.xml.model;

import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlEnumValue;

/**
 * 狀態(tài)枚舉
 */
@XmlEnum
public enum Status {
    @XmlEnumValue("active")
    ACTIVE,

    @XmlEnumValue("inactive")
    INACTIVE,

    @XmlEnumValue("pending")
    PENDING
}

4.4 復(fù)合容器類:PersonList

package com.example.xml.model;

import javax.xml.bind.annotation.*;
import java.util.List;

/**
 * 人員列表容器類
 */
@XmlRootElement(name = "persons") // 指定 XML 根元素名為 persons
@XmlAccessorType(XmlAccessType.FIELD)
public class PersonList {

    @XmlElement(name = "person") // 指定 XML 元素名為 person
    private List<Person> persons;

    // 構(gòu)造函數(shù)
    public PersonList() {}

    public PersonList(List<Person> persons) {
        this.persons = persons;
    }

    // Getter 和 Setter 方法
    public List<Person> getPersons() {
        return persons;
    }

    public void setPersons(List<Person> persons) {
        this.persons = persons;
    }

    @Override
    public String toString() {
        return "PersonList{" +
                "persons=" + persons +
                '}';
    }
}

五、JAXB 序列化(Java Bean -> XML)

5.1 基礎(chǔ)序列化示例

現(xiàn)在,我們來(lái)編寫代碼,將 Java 對(duì)象序列化為 XML。

package com.example.xml.service;

import com.example.xml.model.Address;
import com.example.xml.model.Person;
import com.example.xml.model.PersonList;
import com.example.xml.model.Status;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * JAXB 序列化服務(wù)類
 */
public class XmlSerializationService {

    /**
     * 將單個(gè) Person 對(duì)象序列化為 XML 字符串
     * @param person Person 對(duì)象
     * @return XML 字符串
     * @throws JAXBException
     */
    public static String serializePerson(Person person) throws JAXBException {
        // 1. 創(chuàng)建 JAXBContext,指定要序列化的類
        JAXBContext context = JAXBContext.newInstance(Person.class);

        // 2. 創(chuàng)建 Marshaller
        Marshaller marshaller = context.createMarshaller();

        // 3. 設(shè)置格式化輸出 (可選)
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        // 4. 設(shè)置日期格式 (可選)
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        // 注意:JAXB 默認(rèn)使用 ISO 格式,如需自定義,需要使用適配器

        // 5. 創(chuàng)建 StringWriter 用于接收 XML 輸出
        StringWriter writer = new StringWriter();

        // 6. 執(zhí)行序列化
        marshaller.marshal(person, writer);

        // 7. 返回 XML 字符串
        return writer.toString();
    }

    /**
     * 將 PersonList 對(duì)象序列化為 XML 字符串
     * @param personList PersonList 對(duì)象
     * @return XML 字符串
     * @throws JAXBException
     */
    public static String serializePersonList(PersonList personList) throws JAXBException {
        // 1. 創(chuàng)建 JAXBContext,指定要序列化的類
        JAXBContext context = JAXBContext.newInstance(PersonList.class);

        // 2. 創(chuàng)建 Marshaller
        Marshaller marshaller = context.createMarshaller();

        // 3. 設(shè)置格式化輸出
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        // 4. 創(chuàng)建 StringWriter 用于接收 XML 輸出
        StringWriter writer = new StringWriter();

        // 5. 執(zhí)行序列化
        marshaller.marshal(personList, writer);

        // 6. 返回 XML 字符串
        return writer.toString();
    }

    /**
     * 將 Person 對(duì)象序列化為 XML 文件
     * @param person Person 對(duì)象
     * @param filePath 輸出文件路徑
     * @throws JAXBException
     */
    public static void serializePersonToFile(Person person, String filePath) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(Person.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        // 也可以設(shè)置編碼
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");

        // 6. 執(zhí)行序列化到文件
        marshaller.marshal(person, new java.io.File(filePath));
    }

    /**
     * 主函數(shù)用于測(cè)試序列化
     * @param args 命令行參數(shù)
     */
    public static void main(String[] args) {
        try {
            // 創(chuàng)建一個(gè) Address 對(duì)象
            Address address = new Address("123 Main St", "New York", "10001", "USA");

            // 創(chuàng)建一個(gè) Person 對(duì)象
            Person person = new Person(
                    1L,
                    "張三",
                    "zhangsan@example.com",
                    new SimpleDateFormat("yyyy-MM-dd").parse("1990-05-15"),
                    address,
                    "active"
            );

            // 序列化單個(gè) Person 對(duì)象
            String xmlString = serializePerson(person);
            System.out.println("? 單個(gè) Person 對(duì)象序列化為 XML:");
            System.out.println(xmlString);

            // 創(chuàng)建 PersonList 對(duì)象
            List<Person> persons = new ArrayList<>();
            persons.add(person);
            persons.add(new Person(
                    2L,
                    "李四",
                    "lisi@example.com",
                    new SimpleDateFormat("yyyy-MM-dd").parse("1988-12-01"),
                    new Address("456 Oak Ave", "Los Angeles", "90210", "USA"),
                    "inactive"
            ));

            PersonList personList = new PersonList(persons);

            // 序列化 PersonList 對(duì)象
            String listXmlString = serializePersonList(personList);
            System.out.println("\n? PersonList 對(duì)象序列化為 XML:");
            System.out.println(listXmlString);

            // 序列化到文件
            serializePersonToFile(person, "src/main/resources/person_output.xml");
            System.out.println("\n? Person 對(duì)象已序列化到文件: src/main/resources/person_output.xml");

        } catch (Exception e) {
            System.err.println("? 序列化過(guò)程中發(fā)生錯(cuò)誤: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

5.2 輸出示例

運(yùn)行上述代碼,將會(huì)得到類似以下的 XML 輸出(格式化后):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person id="1">
    <full_name>張三</full_name>
    <email>zhangsan@example.com</email>
    <birth_date>1990-05-15T00:00:00.000+08:00</birth_date>
    <address>
        <street>123 Main St</street>
        <city>New York</city>
        <postal_code>10001</postal_code>
        <country>USA</country>
    </address>
    <status>active</status>
</person>

以及:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persons>
    <person id="1">
        <full_name>張三</full_name>
        <email>zhangsan@example.com</email>
        <birth_date>1990-05-15T00:00:00.000+08:00</birth_date>
        <address>
            <street>123 Main St</street>
            <city>New York</city>
            <postal_code>10001</postal_code>
            <country>USA</country>
        </address>
        <status>active</status>
    </person>
    <person id="2">
        <full_name>李四</full_name>
        <email>lisi@example.com</email>
        <birth_date>1988-12-01T00:00:00.000+08:00</birth_date>
        <address>
            <street>456 Oak Ave</street>
            <city>Los Angeles</city>
            <postal_code>90210</postal_code>
            <country>USA</country>
        </address>
        <status>inactive</status>
    </person>
</persons>

注意:日期格式默認(rèn)使用 ISO 8601 格式,可以通過(guò)自定義 XmlAdapter 來(lái)改變格式。

六、JAXB 反序列化(XML -> Java Bean)

6.1 基礎(chǔ)反序列化示例

接下來(lái),我們演示如何將 XML 字符串或文件反序列化為 Java 對(duì)象。

package com.example.xml.service;

import com.example.xml.model.Address;
import com.example.xml.model.Person;
import com.example.xml.model.PersonList;
import com.example.xml.model.Status;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * JAXB 反序列化服務(wù)類
 */
public class XmlDeserializationService {

    /**
     * 將 XML 字符串反序列化為 Person 對(duì)象
     * @param xmlString XML 字符串
     * @return Person 對(duì)象
     * @throws JAXBException
     */
    public static Person deserializePersonFromString(String xmlString) throws JAXBException {
        // 1. 創(chuàng)建 JAXBContext,指定要反序列化的類
        JAXBContext context = JAXBContext.newInstance(Person.class);

        // 2. 創(chuàng)建 Unmarshaller
        Unmarshaller unmarshaller = context.createUnmarshaller();

        // 3. 創(chuàng)建 StringReader 讀取 XML 字符串
        StringReader reader = new StringReader(xmlString);

        // 4. 執(zhí)行反序列化
        Person person = (Person) unmarshaller.unmarshal(reader);

        // 5. 返回 Person 對(duì)象
        return person;
    }

    /**
     * 將 XML 文件反序列化為 PersonList 對(duì)象
     * @param filePath XML 文件路徑
     * @return PersonList 對(duì)象
     * @throws JAXBException
     */
    public static PersonList deserializePersonListFromFile(String filePath) throws JAXBException {
        // 1. 創(chuàng)建 JAXBContext,指定要反序列化的類
        JAXBContext context = JAXBContext.newInstance(PersonList.class);

        // 2. 創(chuàng)建 Unmarshaller
        Unmarshaller unmarshaller = context.createUnmarshaller();

        // 3. 執(zhí)行反序列化
        PersonList personList = (PersonList) unmarshaller.unmarshal(new java.io.File(filePath));

        // 4. 返回 PersonList 對(duì)象
        return personList;
    }

    /**
     * 主函數(shù)用于測(cè)試反序列化
     * @param args 命令行參數(shù)
     */
    public static void main(String[] args) {
        try {
            // 準(zhǔn)備一個(gè) XML 字符串
            String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
                    "<person id=\"1\">\n" +
                    "    <full_name>張三</full_name>\n" +
                    "    <email>zhangsan@example.com</email>\n" +
                    "    <birth_date>1990-05-15T00:00:00.000+08:00</birth_date>\n" +
                    "    <address>\n" +
                    "        <street>123 Main St</street>\n" +
                    "        <city>New York</city>\n" +
                    "        <postal_code>10001</postal_code>\n" +
                    "        <country>USA</country>\n" +
                    "    </address>\n" +
                    "    <status>active</status>\n" +
                    "</person>";

            // 反序列化單個(gè) Person 對(duì)象
            Person person = deserializePersonFromString(xmlString);
            System.out.println("? 反序列化得到的 Person 對(duì)象:");
            System.out.println(person);

            // 從文件反序列化 PersonList
            PersonList personList = deserializePersonListFromFile("src/main/resources/person_output.xml");
            System.out.println("\n? 從文件反序列化得到的 PersonList 對(duì)象:");
            System.out.println(personList);

        } catch (Exception e) {
            System.err.println("? 反序列化過(guò)程中發(fā)生錯(cuò)誤: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

6.2 輸出示例

運(yùn)行上述代碼,將會(huì)輸出:

? 反序列化得到的 Person 對(duì)象:
Person{id=1, name='張三', email='zhangsan@example.com', birthDate=Thu May 15 00:00:00 CST 1990, address=Address{street='123 Main St', city='New York', zipCode='10001', country='USA'}, status='active'}

? 從文件反序列化得到的 PersonList 對(duì)象:
PersonList{persons=[Person{id=1, name='張三', email='zhangsan@example.com', birthDate=Thu May 15 00:00:00 CST 1990, address=Address{street='123 Main St', city='New York', zipCode='10001', country='USA'}, status='active'}, Person{id=2, name='李四', email='lisi@example.com', birthDate=Mon Dec 01 00:00:00 CST 1988, address=Address{street='456 Oak Ave', city='Los Angeles', zipCode='90210', country='USA'}, status='inactive'}]}

思考:通過(guò)反序列化,我們成功地將 XML 數(shù)據(jù)轉(zhuǎn)換回了原始的 Java 對(duì)象結(jié)構(gòu),這正是 JAXB 的核心價(jià)值所在。

七、高級(jí)特性與最佳實(shí)踐

7.1 自定義日期格式

默認(rèn)情況下,JAXB 使用 ISO 8601 格式處理日期。如果你想自定義日期格式,可以使用 XmlAdapter。

示例:自定義日期格式適配器

package com.example.xml.adapter;

import javax.xml.bind.annotation.adapters.XmlAdapter;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 自定義日期格式適配器
 */
public class DateAdapter extends XmlAdapter<String, Date> {

    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public Date unmarshal(String v) throws Exception {
        return v == null ? null : DATE_FORMAT.parse(v);
    }

    @Override
    public String marshal(Date v) throws Exception {
        return v == null ? null : DATE_FORMAT.format(v);
    }
}

使用適配器

修改 Person 類:

package com.example.xml.model;

import com.example.xml.adapter.DateAdapter;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.Date;

/**
 * 人員信息實(shí)體類 (包含日期適配器)
 */
@XmlRootElement(name = "person")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {"id", "name", "email", "birthDate", "address", "status"})
public class Person {

    @XmlAttribute(name = "id")
    private Long id;

    @XmlElement(name = "full_name")
    private String name;

    @XmlElement
    private String email;

    @XmlElement(name = "birth_date")
    @XmlJavaTypeAdapter(DateAdapter.class) // 應(yīng)用自定義適配器
    private Date birthDate;

    @XmlElement
    private Address address;

    @XmlElement
    private String status;

    // 構(gòu)造函數(shù)、Getter、Setter 等...
    public Person() {}

    public Person(Long id, String name, String email, Date birthDate, Address address, String status) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.birthDate = birthDate;
        this.address = address;
        this.status = status;
    }

    // ... getter and setter methods
}

7.2 處理集合類型

JAXB 對(duì)于集合類型的處理非常方便,只需要在字段上加上 @XmlElement 注解即可。

示例:處理 List

package com.example.xml.model;

import javax.xml.bind.annotation.*;
import java.util.List;

/**
 * 人員列表容器類 (處理集合)
 */
@XmlRootElement(name = "persons")
@XmlAccessorType(XmlAccessType.FIELD)
public class PersonList {

    @XmlElement(name = "person") // 指定列表元素的 XML 名稱
    private List<Person> persons;

    // 構(gòu)造函數(shù)、Getter、Setter ...
    public PersonList() {}

    public PersonList(List<Person> persons) {
        this.persons = persons;
    }

    public List<Person> getPersons() {
        return persons;
    }

    public void setPersons(List<Person> persons) {
        this.persons = persons;
    }

    @Override
    public String toString() {
        return "PersonList{" +
                "persons=" + persons +
                '}';
    }
}

7.3 處理繼承關(guān)系

JAXB 支持處理繼承關(guān)系。通過(guò) @XmlSeeAlso 注解來(lái)聲明子類。

示例:繼承關(guān)系

package com.example.xml.model;

import javax.xml.bind.annotation.*;

/**
 * 基礎(chǔ)人員類
 */
@XmlRootElement(name = "person")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({Employee.class, Customer.class}) // 聲明子類
public class Person {

    @XmlAttribute(name = "id")
    private Long id;

    @XmlElement(name = "full_name")
    private String name;

    @XmlElement
    private String email;

    // ... 其他字段和方法
    public Person() {}

    public Person(Long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    // ... getter and setter methods
}

/**
 * 員工類 (繼承 Person)
 */
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee extends Person {

    @XmlElement
    private String department;

    @XmlElement
    private Double salary;

    public Employee() {}

    public Employee(Long id, String name, String email, String department, Double salary) {
        super(id, name, email);
        this.department = department;
        this.salary = salary;
    }

    // ... getter and setter methods
}

/**
 * 客戶類 (繼承 Person)
 */
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer extends Person {

    @XmlElement
    private String company;

    @XmlElement
    private String contactNumber;

    public Customer() {}

    public Customer(Long id, String name, String email, String company, String contactNumber) {
        super(id, name, email);
        this.company = company;
        this.contactNumber = contactNumber;
    }

    // ... getter and setter methods
}

序列化示例

// 序列化 Employee 對(duì)象
Employee employee = new Employee(1L, "張三", "zhangsan@example.com", "IT", 8000.0);
JAXBContext context = JAXBContext.newInstance(Employee.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(employee, System.out);

輸出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person id="1">
    <full_name>張三</full_name>
    <email>zhangsan@example.com</email>
    <department>IT</department>
    <salary>8000.0</salary>
</person>

注意:為了使繼承關(guān)系能被正確處理,需要在基類上使用 @XmlSeeAlso 注解,并確保 JAXBContext 創(chuàng)建時(shí)包含了所有相關(guān)的類。

7.4 處理未知元素

有時(shí)候 XML 中包含一些無(wú)法映射到 Java 類字段的元素。JAXB 提供了 @XmlAnyElement 注解來(lái)處理這種情況。

示例:處理未知元素

package com.example.xml.model;

import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;
import java.util.List;

/**
 * 帶未知元素處理的人員類
 */
@XmlRootElement(name = "person")
@XmlAccessorType(XmlAccessType.FIELD)
public class PersonWithUnknownElements {

    @XmlAttribute(name = "id")
    private Long id;

    @XmlElement(name = "full_name")
    private String name;

    @XmlElement
    private String email;

    @XmlAnyElement // 處理未知元素
    private List<Element> unknownElements;

    // 構(gòu)造函數(shù)、Getter、Setter ...
    public PersonWithUnknownElements() {}

    public PersonWithUnknownElements(Long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    // ... getter and setter methods
}

7.5 錯(cuò)誤處理與驗(yàn)證

在實(shí)際應(yīng)用中,處理 XML 時(shí)需要考慮錯(cuò)誤情況,如 XML 格式錯(cuò)誤、缺少必要字段等。

示例:基礎(chǔ)錯(cuò)誤處理

package com.example.xml.service;

import com.example.xml.model.Person;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;

public class SafeXmlDeserializationService {

    public static Person safeDeserializePerson(String xmlString) {
        try {
            JAXBContext context = JAXBContext.newInstance(Person.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            StringReader reader = new StringReader(xmlString);
            Person person = (Person) unmarshaller.unmarshal(reader);
            return person;
        } catch (JAXBException e) {
            System.err.println("? XML 解析失敗: " + e.getMessage());
            // 可以記錄日志、拋出自定義異常等
            return null;
        } catch (Exception e) {
            System.err.println("? 其他錯(cuò)誤: " + e.getMessage());
            return null;
        }
    }

    public static void main(String[] args) {
        // 測(cè)試有效的 XML
        String validXml = "<person id=\"1\"><full_name>張三</full_name><email>zhangsan@example.com</email></person>";
        Person person = safeDeserializePerson(validXml);
        if (person != null) {
            System.out.println("? 成功解析: " + person);
        }

        // 測(cè)試無(wú)效的 XML
        String invalidXml = "<person id=\"1\"><full_name>張三</full_name>"; // 缺少閉合標(biāo)簽
        Person invalidPerson = safeDeserializePerson(invalidXml);
        if (invalidPerson == null) {
            System.out.println("? 解析失敗,符合預(yù)期");
        }
    }
}

八、與 Spring Boot 集成

8.1 創(chuàng)建 REST 控制器

在 Spring Boot 項(xiàng)目中,可以很容易地將 JAXB 功能集成到 Web 應(yīng)用中。

package com.example.xml.controller;

import com.example.xml.model.Person;
import com.example.xml.model.PersonList;
import com.example.xml.service.XmlSerializationService;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.util.Arrays;
import java.util.List;

/**
 * XML 導(dǎo)入/導(dǎo)出 REST 控制器
 */
@RestController
@RequestMapping("/api/xml")
public class XmlController {

    /**
     * 導(dǎo)出單個(gè) Person 對(duì)象為 XML
     * @param person Person 對(duì)象
     * @return XML 字符串
     * @throws JAXBException
     */
    @PostMapping(value = "/export/person", produces = MediaType.APPLICATION_XML_VALUE)
    public Person exportPerson(@RequestBody Person person) throws JAXBException {
        // 在實(shí)際應(yīng)用中,這里可以返回 XML 字符串或直接寫入響應(yīng)流
        // 為了演示,我們返回對(duì)象本身
        return person;
    }

    /**
     * 導(dǎo)出 Person 列表為 XML
     * @param persons Person 列表
     * @return XML 字符串
     * @throws JAXBException
     */
    @PostMapping(value = "/export/persons", produces = MediaType.APPLICATION_XML_VALUE)
    public PersonList exportPersons(@RequestBody List<Person> persons) throws JAXBException {
        return new PersonList(persons);
    }

    /**
     * 從 XML 字符串導(dǎo)入 Person 對(duì)象
     * @param xmlString XML 字符串
     * @return Person 對(duì)象
     * @throws JAXBException
     */
    @PostMapping(value = "/import/person", consumes = MediaType.APPLICATION_XML_VALUE)
    public Person importPerson(@RequestBody String xmlString) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(Person.class);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        StringReader reader = new StringReader(xmlString);
        return (Person) unmarshaller.unmarshal(reader);
    }

    /**
     * 從 XML 字符串導(dǎo)入 Person 列表
     * @param xmlString XML 字符串
     * @return Person 列表
     * @throws JAXBException
     */
    @PostMapping(value = "/import/persons", consumes = MediaType.APPLICATION_XML_VALUE)
    public PersonList importPersons(@RequestBody String xmlString) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(PersonList.class);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        StringReader reader = new StringReader(xmlString);
        return (PersonList) unmarshaller.unmarshal(reader);
    }

    /**
     * 測(cè)試端點(diǎn)
     * @return 簡(jiǎn)單的歡迎消息
     */
    @GetMapping("/hello")
    public String hello() {
        return "Hello from XML Controller!";
    }
}

8.2 配置文件

application.yml 中可以添加一些配置:

# application.yml
server:
  port: 8080

# 可以添加一些 JAXB 相關(guān)的配置項(xiàng)
# spring:
#   jackson:
#     ...

8.3 使用示例

啟動(dòng) Spring Boot 應(yīng)用后,你可以使用 curl 或 Postman 等工具進(jìn)行測(cè)試。

導(dǎo)出 XML

# 導(dǎo)出單個(gè) Person
curl -X POST http://localhost:8080/api/xml/export/person \
  -H "Content-Type: application/json" \
  -d '{"id":1,"name":"張三","email":"zhangsan@example.com"}'

# 導(dǎo)出 Person 列表
curl -X POST http://localhost:8080/api/xml/export/persons \
  -H "Content-Type: application/json" \
  -d '[{"id":1,"name":"張三","email":"zhangsan@example.com"},{"id":2,"name":"李四","email":"lisi@example.com"}]'

導(dǎo)入 XML

# 導(dǎo)入單個(gè) Person
curl -X POST http://localhost:8080/api/xml/import/person \
  -H "Content-Type: application/xml" \
  -d '<person id="1"><full_name>張三</full_name><email>zhangsan@example.com</email></person>'

# 導(dǎo)入 Person 列表
curl -X POST http://localhost:8080/api/xml/import/persons \
  -H "Content-Type: application/xml" \
  -d '<persons><person id="1"><full_name>張三</full_name><email>zhangsan@example.com</email></person><person id="2"><full_name>李四</full_name><email>lisi@example.com</email></person></persons>'

九、性能優(yōu)化與注意事項(xiàng)

9.1 性能優(yōu)化建議

  1. 預(yù)初始化 JAXBContextJAXBContext 的創(chuàng)建開(kāi)銷較大,應(yīng)該在應(yīng)用程序啟動(dòng)時(shí)或第一次使用前創(chuàng)建一次,并緩存起來(lái)。
  2. 避免重復(fù)創(chuàng)建 Marshaller/Unmarshaller:同樣,MarshallerUnmarshaller 實(shí)例也可以復(fù)用。
  3. 使用流式處理:對(duì)于大型 XML 文件,考慮使用 StAX(Streaming API for XML)等流式 API 來(lái)減少內(nèi)存占用。
  4. 合理選擇注解:根據(jù)實(shí)際需求選擇合適的注解,避免不必要的復(fù)雜性。

9.2 常見(jiàn)問(wèn)題與解決方案

  1. ClassNotFoundException: 確保 JAXB 依賴已正確添加到項(xiàng)目中。
  2. NoClassDefFoundError: 檢查 JDK 版本和依賴是否匹配。
  3. XML Schema Validation Errors: 確保 XML 結(jié)構(gòu)與 Java 類定義一致。
  4. 日期格式不匹配: 使用 XmlAdapter 自定義日期格式。

十、總結(jié)與展望

JAXB 作為 Java 平臺(tái)的標(biāo)準(zhǔn) XML 綁定技術(shù),為我們提供了強(qiáng)大而便捷的方式來(lái)處理 XML 數(shù)據(jù)。通過(guò)本文的詳細(xì)介紹和代碼示例,我們已經(jīng)掌握了:

  • JAXB 的基本概念和核心組件:理解了 JAXBContext、MarshallerUnmarshaller 的作用。
  • 核心注解的使用:熟練掌握了 @XmlRootElement、@XmlElement、@XmlAttribute 等基礎(chǔ)注解,以及 @XmlAccessorType@XmlType、@XmlTransient 等高級(jí)注解。
  • Java Bean 與 XML 的互轉(zhuǎn):從簡(jiǎn)單的單個(gè)對(duì)象到復(fù)雜的嵌套結(jié)構(gòu)、集合、繼承關(guān)系,都能通過(guò) JAXB 輕松實(shí)現(xiàn)。
  • 高級(jí)功能:學(xué)習(xí)了自定義日期格式、處理繼承關(guān)系、未知元素等高級(jí)特性。
  • 與 Spring Boot 的集成:展示了如何在 Web 應(yīng)用中使用 JAXB。
  • 性能優(yōu)化與最佳實(shí)踐:了解了如何優(yōu)化 JAXB 的使用,避免常見(jiàn)問(wèn)題。

JAXB 的優(yōu)勢(shì)在于其標(biāo)準(zhǔn)性和易用性,它極大地簡(jiǎn)化了 XML 數(shù)據(jù)的處理流程。然而,在某些特定場(chǎng)景下,如處理非常復(fù)雜的 XML Schema 或追求極致性能時(shí),可能需要考慮其他方案,如使用 DOM、SAX 或 STAX API,或者更現(xiàn)代的 JSON 格式。

未來(lái),隨著技術(shù)的發(fā)展,JAXB 仍然會(huì)是處理 XML 數(shù)據(jù)的重要工具之一。對(duì)于那些需要在 Java 應(yīng)用中進(jìn)行 XML 數(shù)據(jù)交換的場(chǎng)景,掌握 JAXB 技術(shù)無(wú)疑是一項(xiàng)寶貴的技能。

希望這篇文章能幫助你全面理解和掌握 JAXB 在 Java Bean 與 XML 互轉(zhuǎn)中的應(yīng)用!

以上就是Java中實(shí)現(xiàn)XML與JavaBean互轉(zhuǎn)的方法的詳細(xì)內(nèi)容,更多關(guān)于Java XML與JavaBean互轉(zhuǎn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 堆內(nèi)存溢出原因分析

    Java 堆內(nèi)存溢出原因分析

    這篇文章主要介紹了Java 堆內(nèi)存溢出原因分析,任何使用過(guò)基于 Java 的企業(yè)級(jí)后端應(yīng)用的軟件開(kāi)發(fā)者都會(huì)遇到過(guò)這種報(bào)錯(cuò),java.lang.OutOfMemoryError:Java heap space。,需要的朋友可以參考下
    2019-06-06
  • 基于SpringBoot+FFmpeg+ZLMediaKit實(shí)現(xiàn)本地視頻推流

    基于SpringBoot+FFmpeg+ZLMediaKit實(shí)現(xiàn)本地視頻推流

    文章介紹了如何在服務(wù)器上安裝和配置ZLMediaKit和FFmpeg,以及如何使用SpringBoot實(shí)現(xiàn)視頻推流和播放功能,包括環(huán)境準(zhǔn)備、后端實(shí)現(xiàn)和使用說(shuō)明,涵蓋了推流和播放的完整流程,需要的朋友可以參考下
    2025-11-11
  • MyBatis實(shí)現(xiàn)兩種查詢樹(shù)形數(shù)據(jù)的方法詳解(嵌套結(jié)果集和遞歸查詢)

    MyBatis實(shí)現(xiàn)兩種查詢樹(shù)形數(shù)據(jù)的方法詳解(嵌套結(jié)果集和遞歸查詢)

    樹(shù)形結(jié)構(gòu)數(shù)據(jù)在開(kāi)發(fā)中十分常見(jiàn),比如:菜單數(shù)、組織樹(shù), 利用 MyBatis 提供嵌套查詢功能可以很方便地實(shí)現(xiàn)這個(gè)功能需求。本文主要介紹了兩種方法,感興趣的可以了解一下
    2021-09-09
  • 詳細(xì)聊一聊java語(yǔ)言中的package和import機(jī)制

    詳細(xì)聊一聊java語(yǔ)言中的package和import機(jī)制

    這篇文章主要給大家介紹了關(guān)于java語(yǔ)言中package和import機(jī)制的相關(guān)資料,Java中的package是指將相關(guān)的類組織在一起的一種機(jī)制,它可以用來(lái)避免命名沖突,也可以方便地管理和維護(hù)代碼,需要的朋友可以參考下
    2024-01-01
  • MyBatis 核心配置文件及映射文件詳解

    MyBatis 核心配置文件及映射文件詳解

    MyBatis是支持定制化SQL、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的持久層框架,本文重點(diǎn)介紹MyBatis 核心配置文件及映射文件,需要的朋友可以參考下
    2023-01-01
  • SpringBoot實(shí)現(xiàn)ThreadLocal父子線程傳值的幾種方式

    SpringBoot實(shí)現(xiàn)ThreadLocal父子線程傳值的幾種方式

    ThreadLocal作為Java中重要的線程本地變量機(jī)制,為我們提供了在單個(gè)線程內(nèi)存儲(chǔ)數(shù)據(jù)的便利,但是,當(dāng)涉及到父子線程之間的數(shù)據(jù)傳遞時(shí),ThreadLocal默認(rèn)的行為并不能滿足我們的需求,所以本文將介紹在SpringBoot應(yīng)用中實(shí)現(xiàn)ThreadLocal父子線程傳值的幾種方式
    2025-12-12
  • 淺談Java內(nèi)存泄露

    淺談Java內(nèi)存泄露

    內(nèi)存泄漏(Memory Leak)是指程序中己動(dòng)態(tài)分配的堆內(nèi)存由于某種原因程序未釋放或無(wú)法釋放,造成系統(tǒng)內(nèi)存的浪費(fèi),導(dǎo)致程序運(yùn)行速度減慢甚至系統(tǒng)崩潰等嚴(yán)重后果。下面我們來(lái)一起了解如何解決
    2019-05-05
  • 詳解Java如何實(shí)現(xiàn)一個(gè)優(yōu)秀的散列表

    詳解Java如何實(shí)現(xiàn)一個(gè)優(yōu)秀的散列表

    這篇文章主要通過(guò)簡(jiǎn)單的示例為大家詳細(xì)介紹了在Java中如何實(shí)現(xiàn)一個(gè)優(yōu)秀的散列表,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以了解一下
    2023-07-07
  • Java 括號(hào)匹配問(wèn)題案例詳解

    Java 括號(hào)匹配問(wèn)題案例詳解

    這篇文章主要介紹了Java 括號(hào)匹配問(wèn)題案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java實(shí)現(xiàn)迷你圖書(shū)管理系統(tǒng)案例全程

    Java實(shí)現(xiàn)迷你圖書(shū)管理系統(tǒng)案例全程

    這篇文章主要為大家詳細(xì)介紹了如何利用java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-12-12

最新評(píng)論

天津市| 贵南县| 扎赉特旗| 彭水| 莒南县| 乌兰县| 广南县| 怀化市| 余姚市| 三都| 常德市| 邳州市| 碌曲县| 南靖县| 柯坪县| 龙门县| 修水县| 兴宁市| 宜兰市| 桃源县| 汝城县| 高邑县| 安义县| 博爱县| 民乐县| 十堰市| 南陵县| 绩溪县| 沐川县| 马山县| 宁都县| 龙江县| 彰武县| 临城县| 环江| 南木林县| 肥西县| 乌鲁木齐县| 双柏县| 光山县| 苏尼特右旗|