Java 中不同类型 类 的相同方法
Same method for different types of classes in Java
我想对不同的 class 名称应用相同的方法:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
InputStreamReader reader = new InputStreamReader(request.getInputStream());
String l;
StringBuilder sb1 = new StringBuilder();
BufferedReader br = new BufferedReader(reader);
while (( l = br.readLine()) != null) {
sb1.append(l);
}
InputStream sb2 = new ByteArrayInputStream(sb1.toString().getBytes());
sb1.toString();
if(sb1.indexOf("CheckStatusRequest") != -1) {
CheckStatusRequest checkStatusRequest = (CheckStatusRequest)testXmlToObject(sb2);
System.out.println(checkStatusRequest.getClass());
}else if(sb1.indexOf("CheckStatusResponse") != -1) {
CheckStatusResponse checkStatusResponse = (CheckStatusResponse)testXmlToObject1(sb2);
System.out.println(checkStatusResponse.getClass());
}else if(sb1.indexOf("Consequences") != -1) {
Consequences consequences = (Consequences)testXmlToObject2(sb2);
System.out.println(consequences.getClass());
}else if(sb1.indexOf("SubscriptionRequest") != -1) {
SubscriptionRequest subscriptionRequest = (SubscriptionRequest)testXmlToObject3(sb2);
System.out.println(subscriptionRequest.getClass());
}else if(sb1.indexOf("TerminateSubscriptionRequest") != -1) {
TerminateSubscriptionRequest terminateSubscriptionRequest = (TerminateSubscriptionRequest)testXmlToObject4(sb2);
System.out.println(terminateSubscriptionRequest.getClass());
}
}
public CheckStatusRequest testXmlToObject(InputStream line) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(CheckStatusRequest.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
CheckStatusRequest object = (CheckStatusRequest)jaxbUnmarshaller.unmarshal(line);
return object;
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
public CheckStatusResponse testXmlToObject1(InputStream line) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(CheckStatusResponse.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
CheckStatusResponse object = (CheckStatusResponse)jaxbUnmarshaller.unmarshal(line);
return object;
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
所提供的解决方案有效,但我认为它实施不当。该方法对每个 class 的工作方式相同,变化只是返回对象的类型。基本上我对每个开关盒都有相同的方法。我尝试实现一个解决方案,其中方法被声明为 Object,当它被调用时进行了转换,但它没有按预期工作,我得到了 javax.xml.bind.UnmarshalException。
你能简化这段代码吗?
您可以使用泛型来做到这一点。将您的 testXmlToObject
更改为:
public <T> T testXmlToObject(InputStream line, Class<T> classe) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(classe);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
T object = (T) jaxbUnmarshaller.unmarshal(line);
return object;
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
您将方法调用为 testXmlToObject(line, CheckStatusRequest.class)
我想对不同的 class 名称应用相同的方法:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
InputStreamReader reader = new InputStreamReader(request.getInputStream());
String l;
StringBuilder sb1 = new StringBuilder();
BufferedReader br = new BufferedReader(reader);
while (( l = br.readLine()) != null) {
sb1.append(l);
}
InputStream sb2 = new ByteArrayInputStream(sb1.toString().getBytes());
sb1.toString();
if(sb1.indexOf("CheckStatusRequest") != -1) {
CheckStatusRequest checkStatusRequest = (CheckStatusRequest)testXmlToObject(sb2);
System.out.println(checkStatusRequest.getClass());
}else if(sb1.indexOf("CheckStatusResponse") != -1) {
CheckStatusResponse checkStatusResponse = (CheckStatusResponse)testXmlToObject1(sb2);
System.out.println(checkStatusResponse.getClass());
}else if(sb1.indexOf("Consequences") != -1) {
Consequences consequences = (Consequences)testXmlToObject2(sb2);
System.out.println(consequences.getClass());
}else if(sb1.indexOf("SubscriptionRequest") != -1) {
SubscriptionRequest subscriptionRequest = (SubscriptionRequest)testXmlToObject3(sb2);
System.out.println(subscriptionRequest.getClass());
}else if(sb1.indexOf("TerminateSubscriptionRequest") != -1) {
TerminateSubscriptionRequest terminateSubscriptionRequest = (TerminateSubscriptionRequest)testXmlToObject4(sb2);
System.out.println(terminateSubscriptionRequest.getClass());
}
}
public CheckStatusRequest testXmlToObject(InputStream line) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(CheckStatusRequest.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
CheckStatusRequest object = (CheckStatusRequest)jaxbUnmarshaller.unmarshal(line);
return object;
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
public CheckStatusResponse testXmlToObject1(InputStream line) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(CheckStatusResponse.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
CheckStatusResponse object = (CheckStatusResponse)jaxbUnmarshaller.unmarshal(line);
return object;
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
所提供的解决方案有效,但我认为它实施不当。该方法对每个 class 的工作方式相同,变化只是返回对象的类型。基本上我对每个开关盒都有相同的方法。我尝试实现一个解决方案,其中方法被声明为 Object,当它被调用时进行了转换,但它没有按预期工作,我得到了 javax.xml.bind.UnmarshalException。 你能简化这段代码吗?
您可以使用泛型来做到这一点。将您的 testXmlToObject
更改为:
public <T> T testXmlToObject(InputStream line, Class<T> classe) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(classe);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
T object = (T) jaxbUnmarshaller.unmarshal(line);
return object;
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
您将方法调用为 testXmlToObject(line, CheckStatusRequest.class)