getConstructor () возвращает исключение NoSuchMethodException при вызове переменной типа Class - PullRequest
2 голосов
/ 11 октября 2019

Я получаю следующее исключение при использовании getConstructor () для переменной типа Class: java.lang.NoSuchMethodException: Main $ Person. ()

Методы getConstructors () и getDeclaredConstructors () работают нормально,Я ожидаю возврата кода: public Main $ Person (Main)

Что может вызвать это и как я могу предотвратить это? Кроме того, что является параметром 'Main', перечисленным ввсе конструкторы? Это ссылка на экземпляр, который его создал ??

См. Код и вывод ниже: import java.lang.reflect. *;

открытый класс Main {

public class PersonSuper 
{
    public int superage; 
    public void supersampleMethod(){} 
    private PersonSuper(){System.out.println("PersonSuper no argument constructor");} 
}
public class Person extends PersonSuper
{
    public int age; 
    public void sampleMethod(String var){} 
    public void sampleMethod2(){}
    private  Person (int ageInput){this.age = ageInput;}
    public  Person(){}
}

 public static void main(String []args) throws Exception{

    try { Class<Person> clss = Person.class;


        Constructor c[] = clss.getConstructors();
        for (int i = 0; i < c.length; i++)
        {System.out.println(c[i]);}
        Constructor c2[] = clss.getDeclaredConstructors();
        System.out.println();
        for (int i = 0; i < c2.length; i++)
        {System.out.println(c2[i]);}
        System.out.println();
        Constructor con = clss.getConstructor(); //This is the code that is not working...
        System.out.println(con); //This is the code that is not working...

    }
    catch(Exception e)
    {System.out.println(e.toString());}

 }

}

Результаты: public Main $ Person (Main)

public Main $ Person (Main)
private Main $ Person (Main, int)

java.lang.NoSuchMethodException: Main $ Person. ()

... Программа завершена с кодом выхода 0
Нажмите клавишу ВВОД, чтобы выйти из консоли.

1 Ответ

2 голосов
/ 11 октября 2019

Вы должны указать внешний класс Main в качестве аргумента для метода getConstructor(), если у вас есть внутренний, нестатический класс, как указано в документации getConstructor():

[...] Если этот Class объект представляет внутренний класс, объявленный в нестатическом контексте, типы формальных параметров включают в себя явный включающий экземпляр в качестве первого параметра.

Таким образом, вы либо пишете

Constructor con = clss.getConstructor(Main.class);

, либо делаете ваши тестовые классы статичными (или в любом случае помещаете их в отдельные файлы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...