内省模式是最简单的方式。Castor XML 使用Java 的反射机制和默认的命名规则来处理XML文档里属性、元素与Java 类、属性之间的绑定关系。
内省模式主要使用org.exolab.castor.xml.Marshaller和 org.exolab.castor.xml.Unmarshaller的静态方法来编组和解组。
下面是一个要编组和解组的Java 类:
@SuppressWarnings("unchecked") public class CD { private String name = null; private String artist = null; private List tracks = null; public CD() { super(); } public CD(String name, String artist) { super(); this.name = name; this.artist = artist; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setArtist(String artist) { this.artist = artist; } public String getArtist() { return artist; } public void setTracks(List tracks) { this.tracks = tracks; } public List getTracks() { return tracks; } public void addTrack(String trackName) { if (tracks == null) { tracks = new ArrayList(); } tracks.add(trackName); } }
下面是一个编组到XML的代码:
public class IntrospectMarshaller { public static void main(String[] args) { try { CD sessions = new CD("Sessions for Robert J", "Eric Clapton"); sessions.addTrack("Little Queen of Spades"); sessions.addTrack("Terraplane Blues"); FileWriter writer = new FileWriter("cds.xml"); Marshaller.marshal(sessions, writer); } catch (Exception e) { System.err.println(e.getMessage()); e.printStackTrace(System.err); } } }
编组生成的XML文档:
<?xml version="1.0" encoding="UTF-8"?> <CD> <artist>Eric Clapton</artist> <name>Sessions for Robert J</name> <tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="java:java.lang.String">Little Queen of Spades</tracks> <tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="java:java.lang.String">Terraplane Blues</tracks> </CD>
从生成的XML文档解组,生成Java 对象的代码:
public class IntrospectUnmarshaller { @SuppressWarnings("unchecked") public static void main(String[] args) { try { FileReader reader = new FileReader("cds.xml"); CD cd = (CD) Unmarshaller.unmarshal(CD.class, reader); System.out.println("CD title: " + cd.getName()); System.out.println("CD artist: " + cd.getArtist()); List tracks = cd.getTracks(); if (tracks == null) { System.out.println("No tracks."); } else { for (Iterator i = tracks.iterator(); i.hasNext();) { System.out.println("Track: " + i.next()); } } } catch (Exception e) { System.err.println(e.getMessage()); e.printStackTrace(System.err); } } }
结果输出:
CD title: Sessions for Robert J
CD artist: Eric Clapton
Track: Little Queen of Spades
Track: Terraplane Blues
内省模式的缺点:
1、Java 类及属性与XML文档的元素、属性之间的绑定的命名规则是由Castor XML框架定义的,这是可能改变的,如果改变了,已有代码可能不能运行。
2、如果XML文档的元素、属性名是我们无法控制的,则无法解决。
3、无法解决一个Java 类映射到多个平台的XML文档(每个平台的XML文档都不同)的情况。