2013-12-03 3 views
0

Я пытаюсь выяснить, как вызвать метод пользовательского класса. Вот процесс, который я пытаюсь сделать:Вызов метода с использованием отражения

1) Я инициализирую массив методов из списка методов моего пользовательского класса и пустой список методов, который будет использоваться для хранения отфильтрованного списка эти методы.

Method method[] = MyClass.getDeclaredMethods(); 
List<Method> x = new ArrayList<Method>(); 

2) Затем я запускаю свой массив методов в цикле for и отфильтровываю, какие методы не заполняют мои требуемые критерии.

for (Method m : methods){ 
     if(...){ 
      if(...){ 
       x.add(m); 
      } 
     } 
    } 

3) Наконец, мне нужно вызвать каждый из методов в завершенном списке. Вот где я застрял, я точно не знаю, как работает функция invoke. Вот что я пытаюсь:

for(int i=0; i < x.size(); i++){ 
    boolean g = x.get(i).invoke(); 
     if(...) 
     else(...) 
} 

Дело в том, я точно знаю, что это такое, я не знаю, я просто не удается найти ответы. На эти вопросы мне нужно ответить:

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

2) Я знаю, что для функции invoke требуются аргументы, одним из которых являются данные параметров для метода. Я не совсем понимаю, что именно должен быть первым аргументом. Я думаю, что первый аргумент - это сам фактический метод, но затем я столкнулся с логическим циклом, потому что способ, которым я его кодировал, имеет метод, использующий функцию invoke, поэтому я тупик.

3) В моем случае методы, которые я хочу вызвать, фактически не принимают никаких параметров, поэтому, когда я действительно выясню, как работает функция invoke, мне нужно установить один из аргументов в значение null, или я просто опустил эту часть списка аргументов?

+3

Первый шаг: прочитайте 'метод # invoke()' javadoc. Он отвечает на ваши вопросы. –

+0

Что это? Я сожалею, очень новый для java и SO, поэтому я не знаком с ним. – user2993636

+0

Java предоставляет действительно хорошую документацию для своего JDK в виде Javadoc. Вы можете прочитать о классе 'Method' и его методах [здесь] (http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html#invoke%28java.lang. Объект,% 20java.lang.Object ...% 29). –

ответ

3

Вы используете .invoke неправильно. Смотрите этот короткий пример:

public class Test { 
    public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { 
     X obj = new X(); 
     Method method = obj.getClass().getMethod("test", null); 
     method.invoke(obj, null); 
    } 
} 

class X { 
    public void test(){ 
     System.out.println("method call"); 
    } 
} 

Выход:

вызов метода

Более подробная информация в docs.

Вызывает базовый метод, представленный этим объектом Method, на указанном объекте с указанными параметрами.

Вы никогда не указывали объект и параметры. Мой образец не использует параметры, поэтому я могу поставить null. Но в любом случае вам необходимо предоставить экземпляр в качестве первого параметра (если он не равен static).

+0

Если это 'static', вы можете передать либо экземпляр, либо' null' в качестве аргумента для первого параметра. –

+0

Действительно ли нужно бросить все эти исключения? Оказывается, это была одна из моих больших проблем. Я все понял, хотя. – user2993636

+0

@ user2993636: либо вы бросаете их, либо ловите их. Я не поймал их, потому что это привлекло бы внимание от фактической цели моего ответа, но что-либо за пределами образца кода должно правильно обрабатывать исключения. –

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