Объяснение и правильный формат параметра "parameterTypes" в методе "java .lang.Class.getMethod ()" - PullRequest
0 голосов
/ 29 марта 2020

У меня есть следующий код -

MyInterface.java -

    default int getNumber() {
        System.out.print("Number: ");
        return in.nextInt();
    }

    default void displayNumber(int num) {
        System.out.println("Number: " + num);
    }

Main.java -

        int num;

        MyInterface obj = new MyInterface() {
        };

        num = (int) obj.getClass().getMethod("getNumber").invoke(obj);
        obj.getClass().getMethod("displayNumber", parameterType).invoke(obj);

Я пропустил exceptions для цель ясности

Здесь я создал interface - MyInterface с двумя methods -

Один method читает число и возвращает его.

other method принимает число как parameter и печатает его.

In Main method Я создал inner class для реализации interface

Теперь с использованием reflection и getMethod() Я могу успешно позвонить первому method, чтобы прочитать число.

Но я не знаю правильный формат для передачи argument, используя getMethod(), и, следовательно, я я не могу успешно вызвать второй method.

Здесь, что должно быть вместо parameterType?

Ответы [ 2 ]

2 голосов
/ 29 марта 2020

Хотя ответ ajc2000 правильный, я бы хотел отметить, что синтаксис .class также будет работать:

Получение объектов класса

Если тип доступен, но экземпляра нет, тогда можно получить класс, добавив «.class» к имени типа. Это также самый простой способ получить класс для примитивного типа.

То есть, также будет работать следующее:

obj.getClass().getMethod("displayNumber", int.class).invoke(obj, 5);
2 голосов
/ 29 марта 2020

В Java Reflection, мы представляем типы с Class объектами. Для любого примитива это можно получить с помощью значения .TYPE из любого класса-обертки примитива. В вашем случае, похоже, что это будет Integer.TYPE (это будет значение для parameterType).

Обратите внимание также, что когда вы на самом деле вызываете displayNumber, вам нужно будет указать некоторое фактическое значение для вашего аргумент. Например, чтобы представить вызов метода displayNumber(5), вам нужно сделать последнюю строку следующей:

obj.getClass().getMethod("displayNumber", Integer.TYPE).invoke(obj, new Integer(5));

Как видите, я осторожен, не предполагая этот примитив 5 автоматически блокируется, поскольку мы обычно используем Object в качестве типа stati c в отражении Java.

...