Как мне получить класс массива через Class.forName (...)? - PullRequest
1 голос
/ 25 мая 2020

Допустим, у меня есть метод do, ожидающий массива аргументов некоторого класса E:

public class D {

    public void do(E ..arg){}

}

public static void main(String[] args) {
    Class z = Class.forName("D");
    Class e = Class.forName("E");
    Method m = z.getDeclaredMethod("do", e);
}

Я хочу получить метод и класс с помощью отражения, но это вызывает

java .lang.NoSuchMethodException

1 Ответ

4 голосов
/ 25 мая 2020

do ожидает массив из E.

Поэтому вместо передачи getDeclaredMethod(...) e передайте его E[].class:

Method m = z.getDeclaredMethod("do", E[].class);

Если вам нужно используйте Class.forName(...), вам нужно немного изменить имя. Если вы распечатаете любой класс объектного массива, вы увидите, что он имеет [L спереди и ; в конце. Просто добавьте это в свой аргумент, и он должен работать:

Class<?> e = Class.forName("[L" + "E" + ";");
Method m = z.getDeclaredMethod("do", e);

Вы также можете написать метод, который возвращает имя класса массива с любым количеством измерений:

public static String getArrayClassName(int dimensions, String base) {
    return "[".repeat(dimensions) + "L" + base + ";";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...