Получаете исключение JavaExecutionException для моего метода invoke? - PullRequest
1 голос
/ 26 августа 2011

Я пытаюсь вызвать метод с помощью отражения.Подпись метода, который я пытаюсь получить, выглядит следующим образом:

public static JPAQuery find(String query, Object... params) {...}

Я использовал следующий фрагмент кода для получения объявленного метода:

Method findEntities = clazz.getDeclaredMethod("find", params);

Я пытаюсь вызватьсо следующим фрагментом:

Object[] args = new Object[2];
args[0] = fieldName + " = ?"; // Of type String
args[1] = entity; // Of a type extending GenericModel
JPAQuery query = (JPAQuery)findEntities.invoke(null, args); <-- EXCEPTION HERE!!!

... но получаются следующие исключения:

play.exceptions.JavaExecutionException: argument type mismatch
....
Caused by: java.lang.IllegalArgumentException: argument type mismatch

и

play.exceptions.JavaExecutionException: wrong number of arguments
...
Caused by: java.lang.IllegalArgumentException: wrong number of arguments

Может кто-нибудь помочь с этим?

Дальнейшее наблюдение

Когда я изменяю строку:

JPAQuery query = (JPAQuery)findEntities.invoke(null, args);

на

JPAQuery query = (JPAQuery)findEntities.invoke(null, fieldName, entity);

одно из исключений с указанием "неправильно"Количество аргументов "исчезнет".Так что у меня сейчас только проблема несоответствия типов аргументов.Почти там ...: D

Ответы [ 2 ]

1 голос
/ 26 августа 2011

публичная статическая JPAQuery find (запрос String, Object ... params)

Этот параметр vararg является просто симпатичным синтаксисом для Object[] params.

Так что вам нужно передать два параметра, String и массив Object с вашей сущностью.

JPAQuery query = (JPAQuery)findEntities.invoke(
     null, fieldName, new Object[]{ entity} );
0 голосов
/ 26 августа 2011
findEntities.invoke(null, args); 

Здесь первый параметр должен быть объектом, из которого вызывается метод. Вы передаете ноль, так что это не может работать.

Для получения дополнительной информации см. Документацию: http://download.oracle.com/javase/1,5.0/docs/api/java/lang/reflect/Method.html#invoke%28java.lang.Object,%20java.lang.Object...%29

Кроме того, я бы рискнул линии:

Method findEntities = clazz.getDeclaredMethod("find", params);

К

Object[] params = new Object[1];
params[0] = Object.class;
Method findEntities = clazz.getDeclaredMethod("find", params);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...