2016-10-07 4 views
0

Scala Reflectionに関する記事をいくつか読んでいます。例: http://docs.scala-lang.org/overviews/reflection/overview.htmlScala Reflection:クラスを取得する方法クラスの文字列

私の場合、特定のクラス名をインスタンス化できるかどうかを確認したいと思います。例: org.apache.spark.sql.catalyst.SqlLexical

ランタイムは私がStringクラス名指定されたクラスを取得することができますどのように2.0

スパークすることができるので、私は直接SqlLexical(スパーク1.6で定義されている)を使用することはできませんか?

おかげ

答えて

0

ない厳密にScalaのソリューションがありますが、コンストラクタを取得し、インスタンスにそれらを呼び出してClassLoader.loadClassでそれをロードしようとすることができます。

0

助けあります:

$ scala 
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92). 
Type in expressions for evaluation. Or try :help. 

scala> import scala.reflect.internal.util.ScalaClassLoader 
import scala.reflect.internal.util.ScalaClassLoader 

scala> ScalaClassLoader(getClass.getClassLoader).tryToLoadClass("scala.Option") 
res0: Option[Class[Nothing]] = Some(class scala.Option) 

scala> ScalaClassLoader(getClass.getClassLoader).create("scala.UninitializedError") 
res1: AnyRef = scala.UninitializedError: uninitialized value 

後方互換性:

$ scala210 
Welcome to Scala version 2.10.5 (OpenJDK 64-Bit Server VM, Java 1.7.0_95). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> import scala.tools.nsc.util.ScalaClassLoader 
import scala.tools.nsc.util.ScalaClassLoader 

scala> ScalaClassLoader(getClass.getClassLoader).create("scala.UninitializedError") 
res0: AnyRef = scala.UninitializedError: uninitialized value 

scala> 

$ scala 
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92). 
Type in expressions for evaluation. Or try :help. 

scala> import scala.tools.nsc.util.ScalaClassLoader 
import scala.tools.nsc.util.ScalaClassLoader 

scala> ScalaClassLoader(getClass.getClassLoader).create("scala.UninitializedError") 
warning: there was one deprecation warning; re-run with -deprecation for details 
res0: AnyRef = scala.UninitializedError: uninitialized value 
+0

スカラ>輸入scala.reflect.internal.util.ScalaClassLoader :7:エラー:オブジェクトScalaClassLoaderは、パッケージのメンバーではありませんscala.reflect.internal.util import scala.reflect.internal.util.ScalaClassLoader ^ – Ted

+0

私が探している解決策は、Scala 2.10と2.11の両方で動作する必要があります – Ted

+0

リフレクションライブラリの構造上、クラスを移動しました。そのような歴史は、FOSSです。 –

関連する問題