ObjectCreateRule尝试通过它的类名称使用加载请求,然后调用Class.newInstance()。为此,请求和响应都需要公共并具有公共默认构造函数。
您有这两个选项: 1.将Request和Response在自己的源文件,使您的公众顶级类中予以公布 2.巢请求和响应,使他们public static
。
如果您选择了两项,那么您的代码如下所示: import java.io.读者; import java.io.StringReader;
import org.apache.commons.digester.Digester;
public class DigExample {
public static void main(String ar[]) {
try {
Digester digester = new Digester();
digester.setValidating(false);
digester.addObjectCreate("response", Response.class);
digester.addObjectCreate("response/request", Request.class);
digester.addBeanPropertySetter("response/request/name", "name");
digester.addBeanPropertySetter("response/request/value", "value");
digester.addSetNext("response/request", "setRequest");
digester.addBeanPropertySetter("response/matches", "matches");
Reader reader = new StringReader(
"<?xml version='1.0' encoding='UTF-8'?>" +
"<response>" +
"<request><name>books</name><value>xml</value></request>" +
"<matches>20</matches>" +
"</response>");
Response response = (Response)digester.parse(reader);
System.out.println(response.toString());
} catch(Exception exc) {
exc.printStackTrace();
}
}
static public class Response {
public Response(){}
private int _matches = 0;
private Request _request;
public Request getRequest() {
return _request;
}
public void setRequest(Request request) {
_request = request;
}
public int getMatches() {
return _matches;
}
public void setMatches(int matches) {
_matches = matches;
}
}
static public class Request {
public Request() {}
private String _name = "";
private String _value = "";
public String getName() {
return _name;
}
public void setName(String name) {
_name = name;
}
public String getValue() {
return _value;
}
public void setValue(String value) {
_value = value;
}
}
}
正如其他人所提到的,如果你使用反射直接自己,你很可能绕过访问修饰符,但是这不是在你的榜样的选项。
你是什么意思,“主类”? – Pointy 2011-02-24 13:31:24
你可以发布导致此异常的代码吗? – 2011-02-24 13:31:59
为什么Response需要与主类在同一个文件中? – justkt 2011-02-24 13:32:01