如何反射调用PrepareStatement.set

时间:2016-01-28 08:01:17

标签: java mysql reflection

我尝试使用以下代码反射性地调用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反射对象不是声明类

的实例

我在这里缺少什么?

2 个答案:

答案 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;