Вызов динамической функции Java
У меня есть массив String, содержащий имена метода в классе yyyyyy
В классе xxxxxx
я делаю экземпляр yyyyyy
(скажем obj
). Теперь я могу вызвать obj.function_name()
, за исключением того, что я хочу читать function_name
из массива String в цикле. Возможно ли это?
Ответы
Ответ 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
}