Вызов динамической функции Java - PullRequest
24 голосов
/ 16 июня 2010

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

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

Ответы [ 2 ]

36 голосов
/ 16 июня 2010

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

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

Однако использование отражения должно быть последним средством. Вы должны использовать более объектно-ориентированные методы.

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

23 голосов
/ 16 июня 2010

Это возможно с помощью рефлексии, хотя вам, вероятно, следует несколько сомневаться в своем дизайне, если вам нужно такое поведение. 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...