Java 如何在scala中动态地输入cast?
我想将“Any”对象转换为运行时类型的对象。基于运行时的类名(字符串),如何将任意对象转换为实际对象 我尝试使用class.forName将类名转换为类对象Java 如何在scala中动态地输入cast?,java,scala,reflection,scala-reflect,Java,Scala,Reflection,Scala Reflect,我想将“Any”对象转换为运行时类型的对象。基于运行时的类名(字符串),如何将任意对象转换为实际对象 我尝试使用class.forName将类名转换为类对象 val clazz=Class.forName(“my.package.Animal”) val any:any=动物(1,“辛巴”) any.asInstanceOf[clazz]//编译错误//正在寻找解决方案 尝试使用 编译器工具箱 package my.package import scala.tools.reflect.Too
val clazz=Class.forName(“my.package.Animal”)
val any:any=动物(1,“辛巴”)
any.asInstanceOf[clazz]//编译错误//正在寻找解决方案
尝试使用
- 编译器工具箱
package my.package import scala.tools.reflect.ToolBox import scala.reflect.runtime.universe._ case class Animal(id: Int, name: String) object App { val any: Any = Animal(1, "simba") val className = "my.package.Animal" val mirror = runtimeMirror(getClass.getClassLoader) val tb = mirror.mkToolBox() tb.eval(tb.parse( s""" import my.package.App._ val animal = any.asInstanceOf[$className] println(animal.id) println(animal.name) """)) }
libraryDependencies+=scalaOrganization.value%”scala反映了“%scalaversation.value
libraryDependencies+=scalaOrganization.value%“scala编译器”%scalaVersion.value
- 或Scala反射
import scala.reflect.runtime.universe._ val mirror = runtimeMirror(getClass.getClassLoader) val classSymbol = mirror.staticClass(className) val typ = classSymbol.toType val idMethodSymbol = typ.decl(TermName("id")).asMethod val nameMethodSymbol = typ.decl(TermName("name")).asMethod val instanceMirror = mirror.reflect(any) val idMethodMirror = instanceMirror.reflectMethod(idMethodSymbol) val nameMethodMirror = instanceMirror.reflectMethod(nameMethodSymbol) println(idMethodMirror()) println(nameMethodMirror())
val clazz = Class.forName(className) val idMethod = clazz.getMethod("id") val nameMethod = clazz.getMethod("name") println(idMethod.invoke(any)) println(nameMethod.invoke(any))
libraryDependencies+=scalaOrganization.value%”scala反映了“%scalaversation.value
- 或Java反射
import scala.reflect.runtime.universe._ val mirror = runtimeMirror(getClass.getClassLoader) val classSymbol = mirror.staticClass(className) val typ = classSymbol.toType val idMethodSymbol = typ.decl(TermName("id")).asMethod val nameMethodSymbol = typ.decl(TermName("name")).asMethod val instanceMirror = mirror.reflect(any) val idMethodMirror = instanceMirror.reflectMethod(idMethodSymbol) val nameMethodMirror = instanceMirror.reflectMethod(nameMethodSymbol) println(idMethodMirror()) println(nameMethodMirror())
val clazz = Class.forName(className) val idMethod = clazz.getMethod("id") val nameMethod = clazz.getMethod("name") println(idMethod.invoke(any)) println(nameMethod.invoke(any))