I am dynamically creating classes in Java and trying to invoke methods in them, however, sometimes I get a java.lang.reflect.InvocationTargetException.
PageGenerator1.java (dynamically created)
import java.io.PrintStream;
import java.util.Map;
public class PageGenerator1 implements DynamicPageGenerator {
public PageGenerator1() {
}
@Override
public void generate(PrintStream out, Map params, Session session) {
out.print("\r\n
\r\n");if (session.get("counter") == null) {
session.set("counter", 2);
out.println("
Hi "+params.get("name")+" this is your first visit
");} else {
out.println("
This is your "+session.get("counter")+" visit
");session.set("counter", 1+((Integer)session.get("counter")));
}
out.print("\r\n\r\n");
}
}
I am trying to invoke it like so:
logger.info(
"Attempting to invoke the method " + generateMethod + " with an instance of " + generatedClassName + "with the following parameters:\n" +
"\tparams: " + params + "\n" +
"\tcookieSession: " + cookiesSession
);
generateMethod.invoke(Class.forName(generatedClassName).newInstance(), ps, params, cookiesSession);
and this is the log entry I get:
INFO: Attempting to invoke the method
public void cs236369.webserver.requesthandlers.tsp.PageGenerator1.generate(java.io.PrintStream,java.util.Map,cs236369.webserver.requesthandlers.tsp.Session)
with an instance of
cs236369.webserver.requesthandlers.tsp.PageGenerator1
with the following parameters:
params: {name=Amir}
cookieSession: {counter=5}
The exception I'm getting doesn't have a message, and I'm not experienced with reflection, etc. so I'm not sure what the error means. Can you help explain what am I doing wrong?
解决方案
InovcationTargetException means that the method that you invoked threw an exception. To figure out what the problem is with your method itself, wrap the invoke method call around a try-catch block and log invocationTargetException.getTargetException().
I can see several places in your generateMethod that you could have errors. Session could be null, session.getCounter() is being cast to Integer -- there could be a classcastexception there.