Hi all:
I'm a newbie to spark and scala and now I am working on
SPARK-5682<https://issues.apache.org/jira/browse/SPARK-5682>(Add encrypted
shuffle in spark). I met a problem:is there any api in spark like
getInstance(className:String):AnyRef ? I saw org.apache.spark.sql.hive
.thriftserver.ReflectionUtils.scala, but not provide getInstance function in it.
Now i only can implement this function by following code:
object ReflectionUtils1 {
import scala.reflect.runtime.universe
abstract case class CryptoCodec() {
}
class JceAesCtrCryptoCodec extends CryptoCodec {
}
class OpensslAesCtrCryptoCodec extends CryptoCodec {
}
def main(args: Array[String]) = {
val className:String = "JceAesCtrCryptoCodec"
val obj = getInstance(className)
val codec:CryptoCodec = obj.asInstanceOf[CryptoCodec]
println(codec)
}
def getInstance(className:String):AnyRef={
val m = universe.runtimeMirror(getClass.getClassLoader)
var c: CryptoCodec = null
if (className.equals("JceAesCtrCryptoCodec")) {
val classCryptoCodec = universe.typeOf[JceAesCtrCryptoCodec]
.typeSymbol.asClass
val cm = m.reflectClass(classCryptoCodec)
val ctor = universe.typeOf[JceAesCtrCryptoCodec].declaration(
universe.nme.CONSTRUCTOR).asMethod
val ctorm = cm.reflectConstructor(ctor)
val p = ctorm()
c = p.asInstanceOf[CryptoCodec]
} else {
val classCryptoCodec = universe.typeOf[OpensslAesCtrCryptoCodec]
.typeSymbol.asClass
val cm = m.reflectClass(classCryptoCodec)
val ctor = universe.typeOf[OpensslAesCtrCryptoCodec].declaration(
universe.nme.CONSTRUCTOR).asMethod
val ctorm = cm.reflectConstructor(ctor)
val p = ctorm()
c = p.asInstanceOf[CryptoCodec]
}
c
}
}
in my getInstance(className:String), i judge classname with
"JceAesCtrCryptoCodec" and
"OpensslAesCtrCryptoCodec" and if the name equals "JceAesCtrCryptoCodec", it
creates the instance by scala.reflect.runtime.universe api. The code can be
better like following way but I do not know how to write it:
def getInstance1(className:String):AnyRef={
val m = universe.runtimeMirror(getClass.getClassLoader)
var classLoader: ClassLoader = Thread.currentThread.getContextClassLoader
val aClass:Class[_] = Class.forName(className, true, classLoader)
val aType: scala.reflect.api.TypeTags.TypeTag = // how to write this
line?
val classCryptoCodec = universe.typeOf[aType]
.typeSymbol.asClass
val cm = m.reflectClass(classCryptoCodec)
val ctor = universe.typeOf[aType].declaration(
universe.nme.CONSTRUCTOR).asMethod
val ctorm = cm.reflectConstructor(ctor)
val p = ctorm()
p
}
Guidance/advice appreciated!
Best regards
Kelly Zhang/Zhang,Liyun