新しい Type Dynamic の使用を検討していますが、明らかなユース ケースが適切に実装されていないことがわかりました。オブジェクト指向データベース用の便利なラッパーを作成しようとしています。オブジェクトをシリアル化および逆シリアル化するため、キャストと使いやすさの問題に悩まされています(メソッドはオブジェクトを返します)。
最初の質問: 私のデータベースの get メソッドは、タイプ A のオブジェクトを逆シリアル化します。オブジェクトのみが表示されます。「基礎となる」オブジェクトが実際にそのメソッドを持っている場合、動的メカニズムは私のために試しますか、それともapplyDynamicで自分で処理する必要がありますか? REPLで試してみましたが、私にはそうではないようです。自分で確認する必要がある場合、最も簡単な方法は (scala の新しいリフレクションを使用するかどうかに関係なく)、そのオブジェクトにメソッド "methodname" があるかどうかを確認し、ある場合はそれを呼び出します。
このhttps://stackoverflow.com/a/11056410/703862に怖がっ て、メソッド呼び出し部分を非常に簡単に行うJavaのリフレクションにフォールバックします。
私はこれを思いつきます:
scala> import java.lang.reflect.Method
import java.lang.reflect.Method
scala> class DynTest3 extends Dynamic {
| def pee():String = "yuppie"
| def execSucced(method: Method, args: Any*):Boolean = return try{method.invoke(args); true} catch { case e: Exception => false }
| def applyDynamic(methodName : String)(args: Any*){
| val succed = classOf[DynTest3].getDeclaredMethods.filter(m => m.getName() == methodName).exists(m => execSucced(m))
| if (!succed)
| throw new java.lang.NoSuchMethodException
| }
| }
defined class DynTest3
しかし:
scala> val y: Object = new DynTest3
y: Object = DynTest3@74c74b55
scala> y.asInstanceOf[Dynamic].pee()
<console>:11: error: value applyDynamic is not a member of Dynamic
y.asInstanceOf[Dynamic].pee()
基本的に、Dynamic にキャストしても、これは機能しません。ユーザーをキャストから救いたいので、ダイナミックにキャストすると、すでにすべてが役に立たなくなります。しかし、暗黙の変換 any2Dynamic を作成できるかもしれません...
ヒントはありますか?