我有一个要求,我需要从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)
}
}
请帮助我了解我在哪里出错了,还有正确和更好的方法。
答案 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)