2016-04-28 5 views
0

私はScalaアプリケーションで使用している自動生成されたJavaクラスを持っています。私は、このJavaクラスの静的メンバにアクセスしたいのですが、このScalaからJava静的メンバーにリフレクションでアクセスする方法を教えてください。

val model = Class 
      .forName("Model123123") 
      .newInstance() 
      .asInstanceOf[GenModel] 

のようなインスタンスを作成することができます

public class Model123123 extends GenModel { 
    public int nclasses() { return 4; } 

    // Names of columns used by model. 
    public static final String[] NAMES = NamesHolder_Model123123.VALUES; 

:ような何か。私は直接このようにすることができます:

Model123123.NAMES 

しかし、リフレクションでそれを行う方法を理解していません。私が試した:

scala> Class.forName("Model123123").NAMES 
<console>:10: error: value NAMES is not a member of Class[?0] 
       Class.forName(model_name).NAMES 

scala> model.getClass.NAMES 
<console>:11: error: value NAMES is not a member of Class[?0] 
       model.getClass.NAMES 

を私はJavaやScalaの反射についてトンを知らないので、私は少し迷ってしまいました。私は同じ親クラスをサブクラス化する多くのクラスを持ち、実行時にクラスを動的に変更したいので、リフレクションでこれを実行しようとしています。

おかげ

答えて

2

それはこのように可能なはずです。

val clazz = Class.forName("Model123123") 
val field = clazz.getDeclaredField("NAMES") 
val value = field.get(null).asInstanceOf[Array[String]] 

私たちは、クラスを取得し、我々は非静的フィールドのために行うのと同じ方法でフィールドを求めます。フィールドを取得したら、getメソッドを呼び出して値を取得できます。 null引数は、値を取得するインスタンス(静的メンバーなので)を渡していないことを意味します。最後に、タイプ情報がこの時点で失われているため、タイプを予想しているタイプに手動でキャストする必要があります。我々はそれのクラスのメンバ以来、いくつかの特定のインスタンス上でそれを設定する必要はありませんので、

あなたは、静的フィールドの値を更新する必要がある場合は、我々は再びnullを渡し

field.set(null, Array[String]("name1", "name2")) 

としてそれを行うことができます。

これは、基本的にはスカラ言語で使用されるJavaの反射です。別のアプローチは、Scalaのミラーを使用することです - あなたの場合はhttp://docs.scala-lang.org/overviews/reflection/environment-universes-mirrors.html

+0

ありがとう、これは完全に機能しました! getDeclaredFieldを認識していなかった – benlaird

1

を、最良の方法は、あなたが、あなたは簡単に名前をアクセスするためにgetNamesメソッドを呼び出すことができなかったような共通のインタフェースhex.genmodel.GenModelにモデルのインスタンスをキャストすることです。

スタティックメンバーにアクセスするためにリフレクションを使用する必要はありません。

関連する問題