Как проверить, имеет ли класс java определенный метод?
У меня есть xml-схема (сгенерированная автоматически с помощью trang), которая продолжает меняться. Эти изменения не очень сложны. Только некоторые элементы добавляются или удаляются из этой схемы. Из этой схемы я создаю классы java (используя cxf), с помощью которых я буду отменять XML-документ.
В результате изменения схемы меняются автоматически созданные пользователем классы Java. Опять же, как и в схеме, изменения в java-классах не очень большие. Например, если в схему добавлен элемент elemA
; некоторые связанные функции говорят, что getElemA()
и setElemA()
добавляются в автоматически сгенерированный класс java.
Теперь, как бы я удостоверился, что определенная функция существует в этих автоматически сгенерированных классах? Одним из решений является ручная запись схемы таким образом, чтобы покрывались все возможные элементы xml. Это то, что я в конечном счете сделаю. Но пока я не исправил формат xml файла.
ОБНОВЛЕНИЕ:
Существует вероятность того, что метод getElemA()
может быть определен в автоматически сгенерированных классах. У меня нет контроля над автогенерацией этих классов. Но в моем основном классе, если есть следующий код,
If method getElemA exists then
ElemA elemA = getElemA()
Этот код всегда будет в моем основном классе. Если метод getElemA()
создается в одном из автоматически генерируемых классов, то проблем нет. Но если этот метод не сгенерирован, компиляторы жалуются, что этот метод не существует ни в одном из классов.
Есть ли способ заставить компилятор не жаловаться на эту функцию во время компиляции?
Ответы
Ответ 1
Один метод упоминается @missingfaktor, а другой - ниже (если вы знаете имя и параметры api).
Скажем, у вас есть один метод, который не принимает аргументов:
Method methodToFind = null;
try {
methodToFind = YouClassName.class.getMethod("myMethodToFind", (Class<?>[]) null);
} catch (NoSuchMethodException | SecurityException e) {
// Your exception handling goes here
}
Вызывает его, если присутствует:
if(methodToFind == null) {
// Method not found.
} else {
// Method found. You can invoke the method like
methodToFind.invoke(<object_on_which_to_call_the_method>, (Object[]) null);
}
Скажем, у вас есть один метод, который принимает собственные int
args:
Method methodToFind = null;
methodToFind = YouClassName.class.getMethod("myMethodToFind", new Class[] { int.class });
Вызывает его, если присутствует:
if(methodToFind == null) {
// Method not found.
} else {
// Method found. You can invoke the method like
methodToFind.invoke(<object_on_which_to_call_the_method>, invoke(this,
Integer.valueOf(10)));
}
Скажем, у вас есть один метод, который принимает в коробке Integer
args:
Method methodToFind = null;
methodToFind = YouClassName.class.getMethod("myMethodToFind", new Class[] { Integer.class });
Вызывает его, если присутствует:
if(methodToFind == null) {
// Method not found.
} else {
// Method found. You can invoke the method like
methodToFind.invoke(<object_on_which_to_call_the_method>, invoke(this,
Integer.valueOf(10)));
}
Использование вышеупомянутого метода soln для вызова не даст вам ошибок компиляции.
Обновлено в соответствии с @Foumpie
Ответ 2
Используйте reflection.
import java.lang.reflect.Method;
boolean hasMethod = false;
Method[] methods = foo.getClass().getMethods();
for (Method m : methods) {
if (m.getName().equals(someString)) {
hasMethod = true;
break;
}
}
Edit:
Итак, вы хотите вызвать метод, если он существует. Вот как вы это делаете:
if (m.getName().equals(someString)) {
try {
Object result = m.invoke(instance, argumentsArray);
// Do whatever you want with the result.
} catch (Exception ex) { // For simplicity sake, I am using Exception.
// You should be handling all the possible exceptions
// separately.
// Handle exception.
}
}
Ответ 3
С Spring:
Method method = ReflectionUtils.findMethod(TheClass, "methodName");
if (method != null) {
//do what you want
}
Ответ 4
Если вы используете Spring Framework, самым простым способом будет использование утилиты ReflectionUtils.findMethod().
Ответ 5
Вы можете использовать Reflection в Java http://docs.oracle.com/javase/tutorial/reflect/index.html
или http://docs.oracle.com/javase/tutorial/reflect/member/methodType.html