我尝试使用以下代码反射性地调用com.mysql.jdbc.PreparedStatement的setXxx方法。
String type = getJavaTypeFromMySqlType(); // this is "String"
Class clazz = type.getClass(); // This is java.lang.String
Method method = com.mysql.jdbc.PreparedStatement.class.getDeclaredMethod("set"+type, int.class, clazz);
method.invoke(cnt, clazz.cast(pair.getValue()));
最后一行抛出
java反射对象不是声明类
的实例
我在这里缺少什么?
答案 0 :(得分:1)
您需要将com.mysql.jdbc.PreparedStatement
作为第一个参数传递给Method.invoke
:
method.invoke(pstmt, cnt, clazz.cast(pair.getValue()));
第一个参数是调用方法的对象(静态方法为null),以下参数是传递给调用方法的参数。
(很遗憾,Method.invoke
的错误消息未提及被拒绝的类型,在您的情况下为Integer
)。
答案 1 :(得分:1)
您可以使用PreparedStatement.setObject(int, Object)
或其中一个兄弟姐妹,而不是反思性地调用它。如果驱动程序支持对象转换,那么这将透明地工作;但如果不支持类型或转换为数据库类型,请准备好处理 UIImageView *backImageView = [[UIImageView alloc]initWithFrame:_discorverCollerction.bounds];
backImageView.image = [UIImage imageNamed:@"sea.jpg"];
UIBlurEffect *beffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight];
UIVisualEffectView *effectview = [[UIVisualEffectView alloc]initWithEffect:beffect];
effectview.frame = backImageView.bounds;
[backImageView addSubview:effectview];
_discorverCollerction.backgroundView = backImageView;
。