0

私はこの (少なくとも私にとっては) 興味深いタスクに直面しています: POJO のようなオブジェクトから SQL 挿入ステートメントを取得することです。単一の DB テーブルにデータを挿入するだけでよいので、Scala アプリケーションと DB の間にフレームワークを追加する必要はありません。

したがって、私のクラスの属性が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、 のパブリック メソッドを取得するために使用しますMyDataObjgetDeclaredMethods親クラスのメソッドを取得できないことに注意する必要があります。

の場合MyDataObjgetDeclaredMethods次のメソッドが返されます。

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 に答える