java.lang.NoSuchMethodException 与构造函数 newInstance [英] java.lang.NoSuchMethodException with Constructor newInstance
问题描述
我目前正在用 Java 开发一些 web 开发项目,我已经实现了一个前端控制器,它的工作是根据路径实例化新的控制器.
I am currently working on some web dev project in Java, i have implemented a frontcontroller, which job is to instantiate new controllers, depending on the path.
所以当用户运行时?q=user/login ex.前端控制器应该设置 UserController,我正在尝试使用这段代码.
So when the user is running ?q=user/login ex. the front controller should instatiate the UserController, that i am trying to do with this piece of code.
String q = request.getParameter("q");
try {
String[] page = q.split("/");
// Make first char upper, to match class name conventions.
page[0] = (page[0].substring(0, 1).toUpperCase() + page[0].substring(1).toLowerCase()).trim();
Class contDes = Class.forName("dk.elvar.rocks." + page[0]+ "Controller");
Constructor co = contDes.getConstructor();
co.newInstance(request, response, page);
结果是
java.lang.NoSuchMethodException: dk.elvar.rocks.UserController.<init>()
at java.lang.Class.getConstructor0(Class.java:2706)
at java.lang.Class.getConstructor(Class.java:1657)
at dk.elvar.rocks.FrontController.doGet(FrontController.java:35)
我试图在谷歌上查找它,并且错误,因为在加载的对象中声明一个构造函数,使类公开,已经存在.
I've tryed to look it up at google, and bugs as, declaring a constructor in loaded object, make the class public, is already there.
用户控制器:
public class UserController extends HttpServlet {
private final String USERNAME = "Martin";
private final String PASSWORD = "David";
private static final long serialVersionUID = 1L;
HttpServletRequest request;
HttpServletResponse response;
public UserController(HttpServletRequest request, HttpServletResponse response, String[] action) {
this.request = request;
this.response = response;
if(action[1].equalsIgnoreCase("login")) {
this.renderLoginAction();
}
if(action[1].equalsIgnoreCase("val-login")) {
this.validateLoginAction();
}
}
推荐答案
您可能会收到此异常,因为该类没有默认构造函数.您可以通过将参数传递给 getConstructor
方法来获取带参数的构造函数:
You probably get this exception because that class does not have a default constructor. You can get a constructor with parameters by passing them to the getConstructor
method:
Constructor co = contDes.getConstructor(
HttpServletRequest.class,
HttpServletResponse.class,
String[].class);
co.newInstance(request, response, page);
这篇关于java.lang.NoSuchMethodException 与构造函数 newInstance的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!