2017-01-06 13 views
0

クラスに与えられたすべての引数/コンストラクタパラメータを取得することは一般に可能ですか?あなただけのこれを行うにのjavareflectionを使用することができますScalaのクラスに渡されたすべての引数を取得する

trait GetMyArgs { 
    def myArgs = ??? 
} 

class Foo(i: Int, d: Double) extends GetMyArgs 

=>

scala> val f = new Foo(5, 6.6) 
scala> f.myArgs 
(5, 6.6) // or similar 
+2

あなたは何をしようとしていますか?反射を使用して一般的には避けてください – daydreamer

+0

http://scalameta.org/を見てください – pedrorijo91

+0

ありがとう、@daydreamer私は基本的にmemoizationの形をしています、これはマップとして機能を実装することによってこれを行う良い方法がありますが、これは既存の関数に記憶させることができるという素晴らしい特性を持っています。 – spiffman

答えて

0
def myArgs = { 
    this.getClass.getDeclaredFields 
     .toList 
     .map(i => { 
     i.setAccessible(true) 
     i.getName -> i.get(this) 
     }).toMap 
    } 

:よう

何か。しかし、変数を使用せず、コンストラクタparamがvalでない場合、はが空のMapを出力します。

+0

ありがとう!実際には、使用されていない変数や、私の場合はメンバーとして格納されていない変数は含めないのが良いプロパティです。私が探していたのは、本質的に、構築されたクラスの特定のインスタンスの「フィンガープリント」です。したがって、変数が異なってもクラスは同じであれば、同じフィンガープリントが必要です。 – spiffman

+0

これは、本質的には、caseクラスに対して 'hashCode'関数が行うことに注意してください。 – spiffman

関連する問題