2012-06-28 1 views
4

Скажем, у меня есть метод, который я желаю, чтобы позвонить, которая имеет аргумент строкиJava/Android метод вызова из строки со значением

Чтобы позвонить, я хотел бы сделать что-то вроде этого .. туРипсЫоп (stringValue);

сейчас, как бы я сделать то же вызов, но динамически, если бы я была строка со значением «MYFUNCTION» ..

что-то вроде

method = [convert "myFunction" string to method]; 
method.invoke(stringValue); 

Я сейчас пытаюсь что-то вроде

java.lang.reflect.Method method;

method = Class.forName("com.blah.MyActivity").getMethod('myFunction',String.class); 
method.invoke (stringValue); 

но получаю ошибку IllegalArgumentException Сообщение ожидается приемник типа com.blah.MyActivity, но получил java.lang.String

+2

@ user353877, вы должны изучить [** это **] (http://stackoverflow.com/posts/11250396/revisions) и понять, как были сделаны изменения. –

+0

вам нужно передать свой экземпляр в качестве первого аргумента. Я считаю, что метод method.invoke (instance, stringValue) ' – nielsbot

+1

извините за плохой заголовок, когда я решил отредактировать вопрос и сделать его код правильным, я ошибочно изменил заголовок, в отличие от того, что я редактировал о вопросе – user353877

ответ

3

Инструкция:

method.invoke (stringValue); 

нуждается объект, в котором будет вызван method.

Так что, если вы пытаетесь что-то вроде:

method = Class.forName("com.blah.MyActivity").getMethod('myFunction',String.class); 
method.invoke(someInstanceOfMyActivity, stringValue); 

он будет работать.

Документация: http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Method.html

+0

Спасибо;), но я не знаю, как получить «someInstanceOfMyActivity», так как я внутри класса, который был вызван «someInstanceOfMyActivity» – user353877

+0

Можете ли вы взглянуть на мой последний комментарий – user353877

+0

, тогда задайте отдельный вопрос, если он еще не задан. @ user353877 – 11684

3

Развейте на мой комментарий выше:

сделать это, чтобы ссылаться на com.blah.MyActivity::myFunction:

com.blah.MyActivity activity = new com.blah.MyActivity() ; 

method = Class.forName("com.blah.MyActivity").getMethod('myFunction',String.class); 
method.invoke (activity, stringValue); 

(простите C синтаксис ++)

Постараюсь чтобы объяснить, почему он работает следующим образом:

метод действительно просто особый тип функции .. это удобство создано, чтобы позволить людям иметь дело с классами и объектами ..

Как вы знаете, внутри методы всегда есть this переменных .. за эту сцену , это передается в качестве параметра, но вместо того, чтобы писать это:

com.blah.MyActivity activity = new com.blah.MyActivity() ; 
com.blah.MyActivity::myFunction(activity, stringValue) 

вы можете удобно записать так:

com.blah.MyActivity activity = new com.blah.MyActivity() ; 
activity.myFunction(stringValue) 

Когда вы получаете метод, используя отражение, это просто «обычный е помазание». Чтобы вызвать его напрямую, вам необходимо передать параметр this.

Вот почему у вас возникли ошибки типа ... myFunction ожидает, что первый скрытый аргумент будет экземпляром его содержащего класса, который вы пропустили.

НТН

+0

Спасибо, что добавили больше информации и нашли время, чтобы объяснить , Мир вам спасибо :) – user353877

+0

Вы получили его? – nielsbot

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