2013-08-22 4 views
1

Есть ли способ использовать метод с использованием отражения без указания его параметров?Java/Метод принятия без указания его параметров

Я попытался это:

method = className.class.getMethod("nameOfTheMethod"); 

Где nameOfTheMethod функция с 5 параметров.

Но он считает, что nameOfTheMethod является функцией без параметров и дает мне java.lang.NoSuchMethodException.

+0

Вам нужно указать типы данных ваших параметров в массиве и передать его в 'getMethod (...)'. – LuigiEdlCarno

ответ

2

Вы можете получить все методы

провозглашенных класса или интерфейса, представленного этим объектом класса.

с

Method[] methods = ClassName.class.getDeclaredMethods(); 

итерацию через них и найти ваши. Это небезопасно, если ваш метод перегружен, поскольку вам все равно придется проверять параметры.

1

Вы не можете этого сделать, getMethod нуждается в количестве параметров.

Что вы можете использовать, это getMethods или getDeclaredMethods, в зависимости от того, что вы ищете, и в соответствии с любым из них с именем, которое вы хотите.

Вы можете получить более 1 из них, соответствующих имени, но с различными параметрами.

getMethods будет

Возвращает массив, содержащие объекты Method отражающих все методы открытого члена класса или интерфейса, представленные этот объект класса, в том числе тех, которые объявлен классом или интерфейсом и унаследованных от суперкласса и суперинтерфейсов

в то время как getDeclaredMethods будет

Возвращает ARRA y объектов Method, отражающих все методы, объявленные классом или интерфейсом, представленным этим объектом класса. Это включает открытый, защищенный, доступ по умолчанию (пакетный) и частные методы, но исключает унаследованные методы.

1

Вы можете достичь этого, используя getDeclaredMethods() и итерации возвращаемого массива.

Method[] methods = className.class.getDeclaredMethods(); 
    for (Method m : methods) { 
     if (m.getName().equals("nameOfTheMethod")) { 
      // found 
      break; 
     } 
    } 

Этот способ имеет недостаток, что он работает только с надежной работой без перегруженных методов. Тем не менее, вы можете легко принять это дальше, поэтому найден массив или набор всех методов с указанным именем.

0

Вы должны указать типы параметров

Попробуйте

Class[] cArg = new Class[5]; 
cArg[0] = Long.class; 
cArg[1] = Long.class; 
cArg[2] = Long.class; 
cArg[3] = Long.class; 
cArg[4] = Long.class; 
Method lMethod = c.getMethod("nameOfMethod", cArg); 

Заменить лонги с любого типа ваши параметры имеют соответственно.

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