Scala运行时反射甚至可以为内部类获取特定类型的所有成员

恩里科·托洛托(Enrico Tolotto)

使用scala 2.12.10

假设我想在运行时将case类隐式转换为Specialcase类SpecialString隐式转换由trait提供External的名称SpecialString应为类的声明名称Special

import scala.reflect.runtime.universe.{runtimeMirror, typeOf}
import scala.reflect.runtime.universe


case class Special(i: Int)
case class SpecialString(s: String)

trait External {
  val rm = runtimeMirror(getClass.getClassLoader)
  val im = rm.reflect(this)
  val members = im.symbol.typeSignature.members
  def specials: Iterable[universe.Symbol] = members.filter(_.typeSignature <:< typeOf[Special] )
  implicit def SpecialIntToString(s: Special): SpecialString = {
    val name = im.reflectField(specials.filter(x => im.reflectField(x.asTerm).get.asInstanceOf[Special] == s).head.asTerm).symbol.toString.replace("value ", "")
    SpecialString(s"name = $name")
  }
}

目前,我能够隐式转换在扩展External特性的类内声明的转换成员

class MyClass extends External {
  val firstSpecial = Special(1)
  val two = 2
  val specialS: SpecialString = firstSpecial
}

class MySecondClass extends MyClass {
  val specialS2: SpecialString = firstSpecial
}
val myClass = new MyClass
print(myClass.specialS) // SpecialString(name = firstSpecial)

但是我无法转换在超类中声明的成员

class MyClass {
  val firstSpecial = Special(1)
  val two = 2
  val specialS: SpecialString = firstSpecial
}

class MySecondClass extends MyClass with External {
  val specialS2: SpecialString = firstSpecial
}
val myClass = new MyClass
print(myClass.specialS)
val mySecondClass = new MySecondClass
print(mySecondClass.specialS2) // java.util.NoSuchElementException: next on empty iterator

有什么帮助吗?

米米(Dmytro Mitin)

如果您按名称而不是typeSignature(然后实际找到了)找到了必要的成员并进行打印specials.head.typeSignaturetypeOf[Special]您将看到为什么一个不是另一个的子类型

trait External {
  ...
  def specials: Iterable[universe.Symbol] =
    members.filter(_.name == universe.TermName("firstSpecial") )
    //members.filter(_.typeSignature.resultType <:< typeOf[Special] )
  println(s"specials.head.typeSignature=${specials.head.typeSignature}=${universe.showRaw(specials.head.typeSignature)}")
  println(s"typeOf[Special]=${typeOf[Special]}=${universe.showRaw(typeOf[Special])}")
  println(s"specials.head.typeSignature <:< typeOf[Special]=${specials.head.typeSignature <:< typeOf[Special]}")
  ...
}

//specials.head.typeSignature=pckg.App.Special=NullaryMethodType(TypeRef(ThisType(pckg.App), pckg.App.Special, List()))
//typeOf[Special]            =pckg.App.Special=TypeRef(ThisType(pckg.App), pckg.App.Special, List())
//specials.head.typeSignature <:< typeOf[Special]=false

返回的无效方法Special的类型不是的子类型Special

您应该添加resultType更换

trait External {
  ...
  def specials: Iterable[universe.Symbol] =
    members.filter(_.typeSignature <:< typeOf[Special] )

trait External {
  ...
  def specials: Iterable[universe.Symbol] =
    members.filter(_.typeSignature.resultType <:< typeOf[Special])

如何在Scala中的运行时查找类参数数据类型

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

为什么甚至可以更改私有成员或使用反射在C#中运行私有方法?

来自分类Dev

Scala使用扩展特征的类的反射来访问运行时类型的成员

来自分类Dev

使用Java反射在运行时上下文中获取所有定义的变量(内部是Voodoo)

来自分类Dev

如何在运行时使用类型定义具有内部类的类?

来自分类Dev

Scala反射在运行时访问所有公共字段

来自分类Dev

是否可以获取algorithm.eaSimple以返回包含运行时所有统计信息的日志?

来自分类Dev

是否可以在运行时获取类型参数?

来自分类Dev

是否可以在运行时获取类型参数?

来自分类Dev

有没有一种方法可以从不同的运行时程序包访问受保护的类成员,而无需进行反射?

来自分类Dev

获取列表的所有成员

来自分类Dev

在运行时通过反射获取嵌套泛型类型对象的属性和属性值

来自分类Dev

为什么使用反射访问外部类的私有成员会引发IllegalAccessException?

来自分类Dev

可以在Rust中的同构结构/元组的所有成员上运行吗?

来自分类Dev

可以在Rust中的同构结构/元组的所有成员上运行吗?

来自分类Dev

在Scala的运行时从Object获取类

来自分类Dev

获取堆栈帧的运行时类型

来自分类Dev

在运行时获取输入类型

来自分类Dev

C#8中的不可为空的引用类型在运行时可以为null吗?

来自分类Dev

成员析构函数运行时,类具有什么类型的虚函数?

来自分类Dev

C ++是静态类型语言,为什么我们可以在运行时获取类型

来自分类Dev

Swift中的朋友类(访问内部类的私有成员)

来自分类Dev

为什么ArrayList的非静态内部类SubList具有成员变量“ parent”?

来自分类Dev

从非成员模板函数访问私有内部类类型

来自分类Dev

静态内部类如何访问外部类的所有静态数据成员和静态成员函数?

来自分类Dev

有什么方法可以获取某个类型的成员以及所有后续基本类型的成员?

来自分类Dev

AutoMapper:运行时类型跳过给定成员

来自分类Dev

在运行时选择类成员的类型

来自分类Dev

从Discord中的特定渠道检索所有成员

来自分类Dev

从Sharepoint 365获取所有成员的列表

Related 相关文章

  1. 1

    为什么甚至可以更改私有成员或使用反射在C#中运行私有方法?

  2. 2

    Scala使用扩展特征的类的反射来访问运行时类型的成员

  3. 3

    使用Java反射在运行时上下文中获取所有定义的变量(内部是Voodoo)

  4. 4

    如何在运行时使用类型定义具有内部类的类?

  5. 5

    Scala反射在运行时访问所有公共字段

  6. 6

    是否可以获取algorithm.eaSimple以返回包含运行时所有统计信息的日志?

  7. 7

    是否可以在运行时获取类型参数?

  8. 8

    是否可以在运行时获取类型参数?

  9. 9

    有没有一种方法可以从不同的运行时程序包访问受保护的类成员,而无需进行反射?

  10. 10

    获取列表的所有成员

  11. 11

    在运行时通过反射获取嵌套泛型类型对象的属性和属性值

  12. 12

    为什么使用反射访问外部类的私有成员会引发IllegalAccessException?

  13. 13

    可以在Rust中的同构结构/元组的所有成员上运行吗?

  14. 14

    可以在Rust中的同构结构/元组的所有成员上运行吗?

  15. 15

    在Scala的运行时从Object获取类

  16. 16

    获取堆栈帧的运行时类型

  17. 17

    在运行时获取输入类型

  18. 18

    C#8中的不可为空的引用类型在运行时可以为null吗?

  19. 19

    成员析构函数运行时,类具有什么类型的虚函数?

  20. 20

    C ++是静态类型语言,为什么我们可以在运行时获取类型

  21. 21

    Swift中的朋友类(访问内部类的私有成员)

  22. 22

    为什么ArrayList的非静态内部类SubList具有成员变量“ parent”?

  23. 23

    从非成员模板函数访问私有内部类类型

  24. 24

    静态内部类如何访问外部类的所有静态数据成员和静态成员函数?

  25. 25

    有什么方法可以获取某个类型的成员以及所有后续基本类型的成员?

  26. 26

    AutoMapper:运行时类型跳过给定成员

  27. 27

    在运行时选择类成员的类型

  28. 28

    从Discord中的特定渠道检索所有成员

  29. 29

    从Sharepoint 365获取所有成员的列表

热门标签

归档