如何从java.lang.Class获取TypeTag

时间:2014-05-27 13:54:43

标签: java scala reflection

我有一个要求,我需要从java或scala类发送第三方类名到我在scala中编写的API。从那个(第三方)类名称,我必须实例化它的对象(可能有参数化构造函数)并调用其相应的方法。我做了尝试,但我对完全反射的工作并不十分清楚,所以它现在看起来像这样:

访问API的外部(java / scala)类:

class AnyRandomClass{

MyAPI api = new API();
api.getThirPartyObject(ThirdPartyClassName);
}

以下是尝试编写scala API:

package mypckg

import scala.reflect.runtime._
import scala.reflect.runtime.universe._

class MyAPI{
def getThirdPartyObject ={
   val u = universe
   val m = u.runtimeMirror(getClass.getClassLoader)
   //throws error : type staticClass is not a member of mypckg.MyAPI.u.Mirror
   m.runtimeClass(typeOf[m.staticClass(clazz.getName).selfType].typeSymbol.asClass)
}

}

请帮助我了解我在哪里出错了,还有正确和更好的方法。

1 个答案:

答案 0 :(得分:1)

  

我有一个要求,我需要从java或scala类发送第三方类名到我在scala中编写的API。从那个(第三方)类名称我必须实例化它的对象(也可能有一个参数化的构造函数)并调用它的相应方法

您不需要TypeTag。只使用Java反射:

val constructors = clazz.getConstructors 
// see also getConstructor, getDeclaredConstructors, and getDeclaredConstructor
val constructor = // select the constructor you need
constructor.newInstance(parameters)
// etc

如果您确实需要使用Scala反射,那么ClassTag应该足够且无关紧要:

ClassTag(clazz)