Какой объект я передаю при вызове метода с использованием отражения - PullRequest
3 голосов
/ 05 марта 2012

Я использую Reflections для получения метода из класса, аннотированного конкретной аннотацией. Как только я получаю список методов в классе, я перебираю методы и, если метод соответствует определенному типу возвращаемого значения, я хочу вызвать этот метод. В целях тестирования я знаю, что метод, который я получаю, возвращает строку.

Reflections reflections = new Reflections(new ConfigurationBuilder()
        .setScanners(new TypesScanner(), new TypeElementsScanner())
        .setUrls(ClasspathHelper.forPackage("stressball"))
);

Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(DependantClass.class);
System.out.println(annotated);

for(Class<?> clazz : annotated) {
    for(Method method : clazz.getMethods()) {
        if(method.isAnnotationPresent(DependantResource.class)) {
            if(method.getReturnType() == String.class) {
                System.out.println(method.invoke(method,(Object[]) null));
            }                   
        }
    }
}

Это метод, который я пытаюсь вызвать

@DependantResource
public String showInjector() {
    return "This is an injector";
}

Я продолжаю получать следующую ошибку, и я знаю, что это имеет отношение к объекту, который я передаю в invoke, но разве метод из цикла не является объектом, который я должен передавать?

Exception in thread "main" java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at stressball.test.DefaultTest.main(DefaultTest.java:35)

1 Ответ

4 голосов
/ 05 марта 2012

Это не правильно:

method.invoke(method,(Object[]) null)

Вы должны сначала создать экземпляр объекта, а затем сделать вызов. Что-то вроде:

method.invoke(clazz.newInstance(), (Object[]) null)
...