0

我正面临这个(至少对我而言)有趣的任务:从类似 POJO 的对象中获取 SQL 插入语句。让我说我不需要在我的 Scala 应用程序和数据库之间添加框架,因为我只需要将数据插入到单个数据库表中。

因此,假设我的类的属性与 DB 表的属性命名相同,我想使用 Scala 反射来从像这样的类中获取

class MyDataObj {
   var a:Int = 345
   var b:Boolean = false
   var c:Double = 1243.98
   var d:String = "A random string"
} 

像这样的 SQL 插入语句

INSERT INTO table_a (a, b, c, d) values (345, false, 1243.98, 'A random String');

好吧,我们需要的是
1) 访问类属性
2) 访问属性类型
3) 访问对象实例的属性值

为了得到这样的东西

List( ("a","Int",345), ("b","Boolean",false), ("c","Double",1243.98), ... )

这将很容易转化为我们想要的。

到目前为止,我刚刚发现了如何访问属性名称

val columns = typeOf[MyDataObj].members.view.filter{_.isTerm}.
                filter{!_.isMethod}.map{_.name}.toList 

我怎样才能得到我需要的其余部分?

一如既往地感谢您对我的支持。

4

1 回答 1

1

在您的情况下,您可以使用以下代码:

val o = new MyDataObj
val attributes = o.getClass.getDeclaredMethods.filter {
  _.getReturnType != Void.TYPE
}.map {
  method => (method.getName, method.getReturnType, method.invoke(o))
}

这里我getDeclaredMethods用来获取MyDataObj. 您需要注意的是getDeclaredMethods无法在其父类中获取方法。

对于MyDataObj,getDeclaredMethods将返回以下方法:

public double MyDataObj.c()
public boolean MyDataObj.b()
public java.lang.String MyDataObj.d()
public int MyDataObj.a()
public void MyDataObj.c_$eq(double)
public void MyDataObj.d_$eq(java.lang.String)
public void MyDataObj.b_$eq(boolean)
public void MyDataObj.a_$eq(int)

所以我添加了一个过滤器来过滤掉不相关的方法。

于 2013-08-26T05:31:47.947 回答