2010-06-16 4 views
21

У меня есть массив строк, содержащий имена метода в классе yyyyyyJava функция динамического вызова

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

+1

Вы можете уточнить? Его не так понятно понимать. –

+3

Я считаю, что термин, который вы ищете, - это «отражение». – Stephen

+0

, и я также уверен, что он имел в виду: http://stackoverflow.com/questions/160970/how-do-invoke-a-java-method-when-given-the-method-name -as-a-string – gumuruh

ответ

32

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

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

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

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

22

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

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

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

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 
} 
+1

Почему бы вам не использовать 'obj.getClass()' вместо 'Class.forName ("yyyyyy") '? – Marc

+0

ссылки перепутаны, попробуйте заменить (% 28 и) на% 29 –

+1

@Marc Я действительно предпочитаю 'yyyyyy.class' над любой из них, но любая работа –

Смежные вопросы