getClass (). getMethod («имя», неизвестно) - PullRequest
5 голосов
/ 18 ноября 2009

Для действительно абстрактного приложения, которое я создаю, мне нужно вызывать методы, не зная их типов параметров и только зная параметры в форме String.

Допустим, у меня есть метод;

getNames(String like, int amount);

и у меня есть массив строк, содержащий 2 параметра, поэтому допустим, что у меня есть;

String[] params = new String[] {"jack", "25"};

Есть ли способ получить и вызвать этот метод с помощью массива params?

Ответы [ 4 ]

2 голосов
/ 18 ноября 2009

Вы можете попробовать


String[] params = new String[] {"jack", "25"};
Object[] realParams = new Object[params.length];
Method[] methods = getClass().getMethods();
for (Method method : methods) {
  if (method.getParameterTypes().length == params.length) {
     for (int i = 0; i < method.getParameterTypes().length; i ++) {
        Class<?> paramClass = method.getParameterTypes()[i];
        if (paramClass = String.class) {
           realParams.add(param);
        } else if (paramClass == Integer.class || paramClass == Integer.TYPE) {
           realParams.add(Integer.parseInt(param));
        } else if (other primitive wrappers) {
            ...
        } else {
          realParams.add(null); // can't create a random object based on just string
          // you can have some object factory here, or use ObjectInputStream
        }
     }
     break; // you can continue here if the parameters weren't converted successfully,     
     //to attempt another method with the same arguments count.
  }
}
1 голос
/ 18 ноября 2009

Похоже на метапрограммирование. Возможно, вы захотите взглянуть на Groovy / Scala, если вы настроены на платформе JVM.

0 голосов
/ 18 ноября 2009

Для динамического программирования используйте динамический язык программирования. Java не очень подходит для такого рода вещей.

Взгляните на API отражения в любом случае, но если вы планируете много программировать для своего приложения, рассмотрите другие альтернативы.

0 голосов
/ 18 ноября 2009

Посмотрите на API отражения Java, они должны (хотя я точно не помню) иметь возможность предоставить вам информацию, необходимую для определения различных типов параметров. Затем вам придется перебирать список и интеллектуально приводить каждый из них на основе того, что API-интерфейс отражений рассказал вам о методе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...