我正试图通过反射来调用一个方法。我试图获得的方法的签名如下:
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
public static JPAQuery find(字符串查询,Object…params(
这个vararg参数只是Object[] params
的一个很好的语法。
因此,您需要传入两个参数,String和一个带有实体的Object数组。
JPAQuery query = (JPAQuery)findEntities.invoke(
null, fieldName, new Object[]{ entity} );
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.Oobject…%29
此外,我还想试试这条线:
Method findEntities = clazz.getDeclaredMethod("find", params);
至
Object[] params = new Object[1];
params[0] = Object.class;
Method findEntities = clazz.getDeclaredMethod("find", params);