ObjectCreateRule 시도는 클래스 이름을 통해 요청로드를 사용하고 Class.newInstance()를 호출합니다. 이것이 작동하려면 Request와 Response 모두 public이 필요하고 public 기본 생성자가 있어야합니다. 1. 요청 및 응답 자신의 소스 파일과 공개 최상위 클래스 내부 그들 공공 2. 둥지 요청 및 응답을하고 public static
합니다
는이 두 가지 옵션이 있습니다.
옵션 2를 사용하면 코드가 다음과 같이 보입니다. 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
이 예외의 원인이되는 코드를 게시 할 수 있습니까? –
Response가 기본 클래스와 동일한 파일에 있어야하는 이유는 무엇입니까? – justkt