簡體   English   中英

帶有構造函數newInstance的java.lang.NoSuchMethodException

[英]java.lang.NoSuchMethodException with Constructor newInstance

我目前正在使用Java開發一些web開發項目,我已經實現了一個前端控制器,該工作是根據路徑實例化新控制器。

那么當用戶運行時?q = user / login ex。 前端控制器應該實現UserController,我正在嘗試使用這段代碼。

    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)

我試着在google上查找它,並且bug,因為在加載對象中聲明構造函數,使類公開,已經存在。

UserController的:

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方法來獲取帶有參數的構造函數:

Constructor co = contDes.getConstructor(
                HttpServletRequest.class, 
                HttpServletResponse.class, 
                String[].class);
co.newInstance(request, response, page);

通常不建議使用其他默認構造函數,因為web.xml或struts-config.xml用於使用反射實例化servlet。

如果你想獲得除默認構造函數之外的類的實例,

Class userController = Class.forName("<packages.>UserController");
Constructor userControllerConstructor = userController.class.getConstructor(HttpServletRequest.class, HttpServletResponse.class, String[].class);
UserController userControllerObj = (UserController)constructor.newInstance(request,response, action);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM