在我的invoke方法上获取JavaExecutionException?

时间:2011-08-26 09:28:49

标签: java reflection

我正试图通过反射来调用方法。我想要获得的方法的签名如下:

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 个答案:

答案 0 :(得分:1)

  

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

vararg参数只是Object[] params的一个很好的语法。

因此,您需要向您的实体传递两个参数,String和Object数组。

JPAQuery query = (JPAQuery)findEntities.invoke(
     null, fieldName, new Object[]{ entity} );

答案 1 :(得分:0)

findEntities.invoke(null, args); 

这里第一个参数应该是调用方法的对象。你传递null,所以它不能工作。

有关详细信息,请参阅文档: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);