Как можно проверить, существует ли метод для класса в Java? Будет ли инструкция try {...} catch {...}
хорошей практикой?
Как проверить, существует ли метод во время выполнения на Java?
Ответ 1
Я предполагаю, что вы хотите проверить метод doSomething(String, Object)
.
Вы можете попробовать следующее:
boolean methodExists = false;
try {
obj.doSomething("", null);
methodExists = true;
} catch (NoSuchMethodError e) {
// ignore
}
Это не сработает, так как метод будет разрешен во время компиляции.
Вам действительно нужно использовать отражение. И если у вас есть доступ к исходному коду метода, который вы хотите вызвать, даже лучше создать интерфейс с помощью метода, который вы хотите вызвать.
[Обновить] Дополнительная информация: существует интерфейс, который может существовать в двух версиях: старый (без метода запроса) и новый (с помощью метода поиска). Исходя из этого, я предлагаю следующее:
package so7058621;
import java.lang.reflect.Method;
public class NetherHelper {
private static final Method getAllowedNether;
static {
Method m = null;
try {
m = World.class.getMethod("getAllowedNether");
} catch (Exception e) {
// doesn't matter
}
getAllowedNether = m;
}
/* Call this method instead from your code. */
public static boolean getAllowedNether(World world) {
if (getAllowedNether != null) {
try {
return ((Boolean) getAllowedNether.invoke(world)).booleanValue();
} catch (Exception e) {
// doesn't matter
}
}
return false;
}
interface World {
//boolean getAllowedNether();
}
public static void main(String[] args) {
System.out.println(getAllowedNether(new World() {
public boolean getAllowedNether() {
return true;
}
}));
}
}
Этот код проверяет, существует ли в интерфейсе метод getAllowedNether
, поэтому неважно, имеют ли фактические объекты этот метод или нет.
Если метод getAllowedNether
нужно вызывать очень часто, и из-за этого вы сталкиваетесь с проблемами производительности, мне придется подумать о более продвинутом ответе. На данный момент это должно быть хорошо.
Ответ 2
API отражения бросает NoSuchMethodException
при использовании Class.getMethod(...)
функций.
В противном случае у Oracle есть хороший учебник об отражении http://download.oracle.com/javase/tutorial/reflect/index.html
Ответ 3
В java это называется отражением. API позволяет вам обнаруживать методы и вызывать их во время выполнения. Вот указатель на документы. Это довольно подробный синтаксис, но он выполнит эту работу:
http://java.sun.com/developer/technicalArticles/ALT/Reflection/
Ответ 4
Я бы использовал отдельный метод для обработки исключения и имел нулевую проверку, чтобы проверить, существует ли метод
Ex: if (null!= getDeclaredMethod (obj, "getId", null)) делает ваши вещи...
private Method getDeclaredMethod(Object obj, String name, Class<?>... parameterTypes) {
// TODO Auto-generated method stub
try {
return obj.getClass().getDeclaredMethod(name, parameterTypes);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}