You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@spark.apache.org by "Zhang, Liyun" <li...@intel.com> on 2015/03/12 07:47:30 UTC

is there any api in spark like getInstance(className:String):AnyRef

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