我一直在阅读 Programming Clojure,并且在理解 Stuarts 的主要 Java Interop 示例时遇到了一些麻烦。他扩展了 DefaultHandler,并创建了一个 startElement 方法,然后将该处理程序传递给 XML 解析器。我不明白的是,到底发生了什么。他的 startElement 实现是否覆盖了 DefaultHandler 中定义的实现?我很困惑。我没有使用 Java 的经验,也没有什么面向对象的经验。
谢谢!
我一直在阅读 Programming Clojure,并且在理解 Stuarts 的主要 Java Interop 示例时遇到了一些麻烦。他扩展了 DefaultHandler,并创建了一个 startElement 方法,然后将该处理程序传递给 XML 解析器。我不明白的是,到底发生了什么。他的 startElement 实现是否覆盖了 DefaultHandler 中定义的实现?我很困惑。我没有使用 Java 的经验,也没有什么面向对象的经验。
谢谢!
我不拥有这本书,但我找到了代码,看起来你是对的。这是功能(供其他人查看):
(def print-element-handler
(proxy [DefaultHandler] []
(startElement
[uri local qname atts]
(println (format "Saw element: %s" qname)))))
你是对的。代理语句创建了一个新类,与这段 Java 代码等价:
public class SomeNewClass extends DefaultHandler {
public void startElement(String uri,
String localName,
String qName,
Attributes attributes) {
System.out.println(*stuff*);
}
}
因此,代理语句定义了该类,并为您提供了一个实例,该实例现在保存在 print-element-handler 中。
浏览 DefaultHandler 的 Java 文档回答了我自己的问题。http://java.sun.com/j2se/1.4.2/docs/api/org/xml/sax/helpers/DefaultHandler.html#startElement%28java.lang.String,%20java.lang.String,%20java。 lang.String,%20org.xml.sax.Attributes%29
默认情况下,什么都不做。应用程序编写者可以在子类中覆盖此方法以在每个元素的开头采取特定操作(例如分配新的树节点或将输出写入文件)。