【问题标题】:How can I match constructor types with Java reflection with Scala primitive types?如何将构造函数类型与 Java 反射与 Scala 原始类型匹配?
【发布时间】:2020-01-28 22:09:12
【问题描述】:

假设我有这门课:

case class Person(name: String, age: Int)

我想在运行时使用 Java 反射(不是 Scala)来反射类。 (这是因为我正在开发一个 Dotty 库,它具有静态反射,但没有运行时反射。)

我能够知道我的构造函数参数的类型:java.lang.String 和 Scala.Int。 但是当我反思 Person 时:

classOf[Person].getConstructors.toList
// List(public com.mypkg.sub.Person(java.lang.String,int))

看到那里的“int”了吗?这导致我无法找到匹配的构造函数。如果我知道类型,我可以在 Class 上使用 Java 反射来查找构造函数。我如何要求 int?其他地方的一些帖子建议使用 Integer.TYPE,但这对我来说是 Scala.Int。

如何才能成功拨打clazz.getConstructor(???)?

【问题讨论】:

  • 很少推荐运行时反射
  • classOf[Person].getConstructor(classOf[String], classOf[Int])
  • 运行时反射很常见,但是为什么需要使用Java反射而不是Scala反射呢? @insan-e 的答案可以得到那个构造函数。即使您的回答也可以为您效劳,例如classOf[Person].getConstructors.toList.head

标签: java scala


【解决方案1】:

请求它的 ClassTag:

scala> implicitly[reflect.ClassTag[Int]].runtimeClass eq java.lang.Integer.TYPE                                                                     
val res3: Boolean = true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2015-04-09
    • 1970-01-01
    • 2011-12-28
    • 2020-07-17
    相关资源
    最近更新 更多