2015-04-16 4 views
0

Я пытался разработать приложение. Сценарий bean будет записан в соответствии с требованием, которое, в свою очередь, вызовет методы (определенные в приложении) в различном порядке в соответствии с требованием. Код приложения (отдельно для скрипта bean) не будет изменен.Общий вызов метода с использованием java-отражения api

Кроме того, приложение использует внешние банки, которые обеспечивают большое количество методов, некоторые из которых реализованы в приложении. Тем не менее, я хотел бы иметь возможность использовать другие методы (те, которые еще не реализованы), без внесения изменений в приложение, если возникнет это требование. Для этого я хотел бы использовать API отражения Java. Пользователь должен иметь возможность вызывать любой метод, присутствующий во внешних баночках, путем передачи имени метода и соответствующих параметров (используя внешнюю документацию).

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

public void callExternalJarMethod(String methodName, Class[] methodParameterTypes, Object[] methodParameters) 
throws NoSuchMethodException { 

String className = "SampleClassName"; 
Class classObject = Class.forName(className); 
Method methodObject; 

    if (methodParameterTypes.length == 0) { 
     methodObject = classObject.getMethod(methodName, null); 
    } else {   
     methodObject = classObject.getMethod(methodName, methodParameterTypes);   
    } 

    // Not handling calling of static methods in which case "null" would be passed instead of methodObject to the invoke method 
    Object returnValue = methodObject.invoke(methodObject, methodParameters); 
} 

Я пытаюсь найти способ, я могу получить класс [] methodParameterTypes и Object [] methodParameters, заполненные соответствующими значениями. У меня были бы типы параметров и значения параметров как строка. Также будут оценены любые указатели на полезные утилиты.

Заранее спасибо.

+0

Ну, какие типы параметров и значения? – immibis

+0

Поскольку для общего использования типы параметров могут быть целыми, строковыми и другими возможными (типами) параметрами. Значения параметров будут действительными значениями, типичными для String (input) для соответствующего типа параметра. – user34140

+0

Вы не можете просто ** придать ** 'String' произвольным классам. – fabian

ответ

0

Вы не передавая экземпляр SampleClassName к Method.invoke() вызова здесь ...

Object returnValue = methodObject.invoke(methodObject, methodParameters); 

Если метод вы собираетесь вызвать это статический, вы можете это сделать ...

Object returnValue = methodObject.invoke(null, methodParameters); 

в противном случае (не статический), необходимо создать экземпляр SampleClassName для выполнения метода on.

Если класс не нужны никакие аргументы конструктора, можно использовать ...

Object returnValue = methodObject.invoke(classObject.newInstance(), methodParameters); 

(Очевидно, что будет нагрузка исключений, которые вы должны обрабатывать, делая «newInstance» и «вызвать» ...)

+0

Не слишком уверен, что это действительно вопрос о дженериках, это скорее отражение API один ... – BretC

+0

Спасибо Брет. Извините за путаницу - вопрос не о дженериках. Я имел в виду generic, чтобы попытаться сообщить, что метод, который мне может потребоваться, может меняться и может принимать множество параметров, таких как String, Int и т. Д. – user34140

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