Android / Java: вызов метода с использованием отражения? - PullRequest
9 голосов
/ 04 февраля 2011

У меня есть статический метод с именем chooseDialog (String s, int i), в котором я хочу вызвать другой метод в том же классе (Dialogs.class) на основе параметров, предоставленных для ChooseDialog.s - это название нужного метода, а i - его единственный параметр.

Я пробовал многочисленные учебные пособия и потратил несколько часов, читая эту тему, но не могу понять, какчто именно мне нужно сделать.

Есть идеи?

Спасибо!

Ответы [ 3 ]

16 голосов
/ 04 февраля 2011

Почему вы хотите вызвать метод с именем, переданным в параметре String? Не можете ли вы создать константы для разных действий, затем использовать switch и в каждом случае вызывать метод с параметром i?

Вы будете иметь преимущество в том, что компилятор проверит ваш код на наличие ошибок.

edit : если вы действительно хотите использовать отражение, получите объект Method с:

Method m = YourClass.class.getMethod("method_name",new Class[] { Integer.class }) 

Я думаю, Integer.class может работать. Затем вызовите метод как

m.invoke(null,123); //first argument is the object to invoke on, ignored if static method
2 голосов
/ 04 февраля 2011
Method method = Dialogs.getMethod(s, Integer.class);
method.invoke(null, i);
1 голос
/ 05 февраля 2011

Если вы просто хотите вызвать другой статический метод в классе, тогда вы можете использовать подход, уже определенный другими:

Method method = Dialogs.getMethod(s, Integer.class);
method.invoke(null, i);

Но если вы хотите иметь возможность использовать статический метод для вызова нестатического метода, то вам нужно будет передать объект, на который вы хотите сослаться, или сделать ChooseDialog нестатичным.

function chooseDialog(Object o, String s, Integer i) {
    Method method = Dialogs.getMethod(o, Integer.class);
    method.invoke(o, i);
}

Но я не думаю, что это правильный способ ООП решить проблему. И, основываясь на ваших комментариях, рефлексия не является абсолютно необходимой, и есть выбор, позволяющий анализировать строку и передавать ее соответствующему методу, что является гораздо более безопасным подходом. При любом подходе ваши юнит-тесты должны выглядеть одинаково.

    if (s.equals("dialog1")) {
        dialog1(i);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...