Подтвердить что ты не робот

Вызов динамической функции Java

У меня есть массив String, содержащий имена метода в классе yyyyyy

В классе xxxxxx я делаю экземпляр yyyyyy (скажем obj). Теперь я могу вызвать obj.function_name(), за исключением того, что я хочу читать function_name из массива String в цикле. Возможно ли это?

4b9b3361

Ответ 1

Вы можете, используя отражение. Это делается путем вызова Yyyy.class.getMethod("methodName").invoke(someArgs)

Вам придется обрабатывать кучу исключений, и ваш метод должен быть public. Обратите внимание, что соглашения java-кодирования предпочитают от methodName до method_name.

Использование рефлексии, однако, должно быть в последнюю очередь. Вы должны использовать больше объектно-ориентированных методов.

Если вам постоянно нужны подобные функции, возможно, вы можете посмотреть на какой-то динамический язык, запущенный на платформе java, например groovy

Ответ 2

Это возможно с использованием рефлексии, хотя вам, вероятно, придется немного сомневаться в своем дизайне, если вам нужно такое поведение. Class.getMethod принимает значение String для имени метода и возвращает объект Method, который затем вы можете вызвать .invoke для вызова метода

Эти страницы Javadoc должны быть полезны:

Пример кода (если методы yyyyyy принимают один аргумент int, просто чтобы показать передачу аргументов):

yyyyyy obj = new yyyyyy();
String[] methodNames = {"foo", "bar", "baz"};
for(String methodName : methodNames) {
    Method method = Class.forName("yyyyyy").getMethod(methodName, new Class[] {int.class});
    method.invoke(obj, 4); // 4 is the argument to pass to the method
}