Используя отражение Java для создания оценки () метод

У меня есть вопрос об отражении, я пытаюсь иметь некоторую оценку () метод. Таким образом, я могу звонить, например:

eval("test('woohoo')");

Теперь я понимаю нет никакого метода оценки в Java, но существует отражение. Я сделал следующий код:

String s = "test";
Class cl = Class.forName("Main");
Method method = cl.getMethod(s, String.class);
method.invoke(null, "woohoo");

Это работает отлично (конечно, существует попытка, блок выгоды вокруг этого кода). Это выполняет метод тестирования. Однако я хочу назвать несколько методов, кто у всех есть различные параметры.

Я не знаю, какие параметры это (так не только String.class). Но и как это возможно? как я могу получить типы параметра метода? Я знаю о следующем методе:

Class[] parameterTypes = method.getParameterTypes();

Но это возвратит parameterTypes метода, который я просто выбрал! со следующим утверждением:

Method method = cl.getMethod(s, String.class);

Любая справка ценилась бы!

5
задан Reinstate Monica -- notmaynard 2 January 2014 в 18:59
поделиться

4 ответа

Вам нужно будет вызвать Class .getMethods () и перебираем их в поисках правильной функции.

For (Method method : clazz.getMethods()) {
  if (method.getName().equals("...")) {
    ...
  }
}

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

getMethods () возвращает все общедоступные методы в классе, включая методы из суперклассов. Альтернативой является Class.getDeclaredMethods () , который возвращает все методы только этого класса .

15
ответ дан 18 December 2019 в 06:34
поделиться

Вы можете перебрать все методы класса, используя:

cls.getMethods(); // gets all public methods (from the whole class hierarchy)

или

cls.getDeclaredMethods(); // get all methods declared by this class

.

for (Method method : cls.getMethods()) {
    // make your checks and calls here
}
5
ответ дан 18 December 2019 в 06:34
поделиться

Вы можете использовать getMethods () , который возвращает массив всех методов класса. Внутри цикла вы можете проверить параметры каждого метода.

for(Method m : cl.getMethods()) {
   Class<?>[] params = m.getParameterTypes();
   ...
}

В противном случае вы можете использовать getDelcaredMethods () , который позволит вам «видеть» частные методы (но не унаследованные методы). Обратите внимание, что если вы хотите вызвать частные методы, вы должны сначала применить к нему setAccessible (логический флаг) :

for(Method m : cl.getDelcaredMethods()) {
   m.setAccessible(true);
   Class<?>[] params = m.getParameterTypes();
   ...
}
2
ответ дан 18 December 2019 в 06:34
поделиться

Хорошо, спасибо всем, кто ответил на мой вопрос здесь, окончательное решение:

import java.lang.reflect.Method;
public class Main {
   public static void main(String[] args){
      String func = "test";
      Object arguments[] = {"this is ", "really cool"};
      try{
         Class cl = Class.forName("Main");
         for (Method method : cl.getMethods()){
            if(method.getName().equals(func)){
               method.invoke(null, arguments);
            }
          }
       } catch (Exception ioe){
          System.out.println(ioe);
       }
    }
  public static void test(String s, String b){
     System.out.println(s+b);
  }
}
2
ответ дан 18 December 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: