我一直在用Java反射弄脏我的手,遇到了一些障碍。如果尝试通过反射调用以下方法,则会抛出java.lang.NoSuchMethodException: org.demonking.CrossHandler.HandleRequest(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
。
这是该方法的代码:
public void HandleRequest(HttpServletRequest req,HttpServletResponse resp)
{
try{
System.out.println("i am here");
//RequestDispatcher view = req.getRequestDispatcher("CrossFile.jsp");
// don't add your web-app name to the path
// view.forward(req, resp);
}catch(Exception ex)
{
System.out.println("in exception");
}
}
这是反射代码:
try {
Method m=cls.getMethod("HandleRequest", HttpServletRequest.class,HttpServletResponse.class); // error on this line
//Object obj=cls.newInstance();
//m.invoke(obj,new Object[]{req,resp});
} catch (Exception ex) {
ex.printStackTrace();
System.out.println(ex.getCause());
}
请注意,其他通过反射调用的方法也可以正常工作。
这是我通过classloader加载类的方式。还请注意,反射代码放置在Web应用程序的Servlet类的doGet方法中,其中,加载的类和被调用的方法驻留在其他非Web应用程序中。同样,通过反射仅使用具有httpservletrequest和response参数的该方法,该类的其他方法也可以正常工作。
File file = new File("C:\\Users\\Demonking\\Documents\\eclipseprojects\\ADemoOne\\bin\\");
URL url = file.toURI().toURL();
URL[] urls = new URL[] { url};
ClassLoader cl = new URLClassLoader(urls);
Class<?> cls = cl.loadClass("org.demonking.CrossHandler");
try {
Method m=cls.getMethod("HandleRequest", HttpServletRequest.class,HttpServletResponse.class);
Object obj=cls.newInstance();
m.invoke(obj,new Object[]{req,resp});
} catch (Exception ex)
{
ex.printStackTrace();
System.out.println(ex.getCause());
}