У меня есть вопрос об отражении, я пытаюсь иметь некоторую оценку () метод. Таким образом, я могу звонить, например:
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);
Любая справка ценилась бы!
Вам нужно будет вызвать Class .getMethods ()
и перебираем их в поисках правильной функции.
For (Method method : clazz.getMethods()) {
if (method.getName().equals("...")) {
...
}
}
Причина в том, что может быть несколько методов с одним и тем же именем и разными типами параметров (т.е. имя метода перегружено).
getMethods ()
возвращает все общедоступные методы в классе, включая методы из суперклассов. Альтернативой является Class.getDeclaredMethods ()
, который возвращает все методы только этого класса .
Вы можете перебрать все методы класса, используя:
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
}
Вы можете использовать getMethods ()
, который возвращает массив всех методов класса.
Внутри цикла вы можете проверить параметры каждого метода.
for(Method m : cl.getMethods()) {
Class<?>[] params = m.getParameterTypes();
...
}
В противном случае вы можете использовать getDelcaredMethods ()
, который позволит вам «видеть» частные методы (но не унаследованные методы). Обратите внимание, что если вы хотите вызвать частные методы, вы должны сначала применить к нему setAccessible (логический флаг) :
for(Method m : cl.getDelcaredMethods()) {
m.setAccessible(true);
Class<?>[] params = m.getParameterTypes();
...
}
Хорошо, спасибо всем, кто ответил на мой вопрос здесь, окончательное решение:
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);
}
}