我正试图通过反射来调用方法。我想要获得的方法的签名如下:
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
答案 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,所以它不能工作。
此外,我还有机会:
Method findEntities = clazz.getDeclaredMethod("find", params);
要
Object[] params = new Object[1];
params[0] = Object.class;
Method findEntities = clazz.getDeclaredMethod("find", params);