Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在scala中动态地输入cast?_Java_Scala_Reflection_Scala Reflect - Fatal编程技术网

Java 如何在scala中动态地输入cast?

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

我想将“Any”对象转换为运行时类型的对象。基于运行时的类名(字符串),如何将任意对象转换为实际对象

我尝试使用class.forName将类名转换为类对象

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))
    

请问,您为什么需要这个?我希望有比运行时更好的选择。谢谢@luis miguel mejía-suárez。我将POJO对象作为字节数组存储在文件中。我有一个文件到对象的映射。当我试图从文件中读取POJO时,我必须将它们转换为正确的对象。但为什么需要强制转换?你要对这些对象调用方法吗?如果强制转换是动态的,您如何在编译时知道哪些方法可用?我必须使用这些对象调用一堆setter函数。我想我可以做一个模式匹配和设置them@sen我知道可能有一些原因不允许你。但是,我建议您将这些POJO更改为Case类,并使用序列化器、反序列化器,它能够像JSON一样返回正确的类型现在,假设您不能更改代码,您可以共享代码的真实用例吗?比如,你怎么读它们,怎么称呼二传手,你想怎么投它们。