Что я могу передать в качестве второго аргумента в getMethod отражения java, чтобы указать отсутствие параметра (ов)? - PullRequest
0 голосов
/ 05 января 2012

Я делаю какие-то странные размышления, чтобы обернуть целую кучу методов в классе. java docs предполагают, что решением будет null, но это не удается с NoSuchMethodException.

 public Method getMethod(String name,
                         Class[] parameterTypes)
                  throws NoSuchMethodException,
                         SecurityException

Если параметрTypes имеет значение null, он обрабатывается так, как если бы он был пустым массивом.

Начнем с того, что я пытаюсь:

private <T> T invokeWrappedFunction(Object instance, String methodName, Object... args) {
    try{
        Method m = instance.getClass().getMethod(methodName, (args == null ? null : args.getClass()));
        return (T) m.invoke(instance, args);
    } catch(Exception e) {
        //This is an example, you're lucky I even acknowledged the exception!
    }
}

Теперь, в конце концов, там будет много дополнительных функций, и экземпляр не является неизвестным типом, поэтому я могу помочьмелочи на неудачи и тому подобное.Реальный вопрос в том, как мне заставить getMethod работать?

Ответы [ 2 ]

1 голос
/ 05 января 2012

Основываясь на комментариях, я добавляю ответ, чтобы проиллюстрировать, что я имею в виду.

private <T> T invokeWrappedFunction(Object instance, String methodName, Object... args) {
    Class[] classes = null;
    if (args != null) {
        classes = new Class[args.length];
        for (int i = 0; i < args.length; ++i) {
            classes[i] = args[i].getClass();
        }
    }

    try {
        Method m = instance.getClass().getMethod(methodName, classes);
        return (T) m.invoke(instance, args);
    } catch(Exception e) {
        //This is an example, you're lucky I even acknowledged the exception!
    }
}

Хотя в некоторых случаях это все равно не будет работать.Если передаваемый вами объект является подклассом формального типа параметра, он не будет работать.

Например:

interface I {
    void method();
}
class C implements I {
    public void method() {
        ... code ...
    }
}

Если вы попытаетесь отразить метод, ожидающий получитьI но вы передаете его C, тогда getMethod(...) сгенерирует исключение вместо того, чтобы возвращать нужный метод, потому что C не равен I.

1 голос
/ 05 января 2012

Я думаю, что вы передаете new Class[0];

например

final static Class[] NO_ARGS = new Class[0];
Method m = Method m = instance.getClass().getMethod(methodName, NO_ARGS);

ДОБАВЛЕНО

Возможно, я не понимаю полный вопрос.Если проблема не в версии без аргументов.но с версией args вы можете справиться с этим, если аргументы представляют собой массив все того же типа .Если это разные типы, я думаю, что у вас проблемы.

Сначала убедитесь, что args не является нулем, а что это массив, затем вызовите Class.getComponentType (), например,

if (args != null) {
   Class c = args.getClass();
   if (c.isArray()) 
      Class arrayClass = c.getComponentType();
   // do something here...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...