【问题标题】:Scala get classtag from class instanceScala从类实例中获取类标签
【发布时间】:2017-11-28 17:16:30
【问题描述】:

我需要编写一个通用方法来获取对象的所有字段及其值,该对象的类可能包含ClassTag,所以我们也应该找到一种方法来获取它,有什么好的方法吗?困难是我们不知道前面的类,它可能包含 ClassTag(从零到多个),也可能不。

例如,

class A(x : Int) {}

a = new A(1)

我们应该输出 x => 1

class B[T: ClassTag]() {}

b = new B[Float]()

我们应该输出 _$1 = Float

【问题讨论】:

    标签: scala reflection classtag


    【解决方案1】:
    def fields(obj: AnyRef) = obj.getClass.getDeclaredFields.map(field => (field.getName, field.get(obj))
    

    将为您提供一组字段名称和相应值对,您可以将其调整为您想要的格式。您可以测试类型并根据您是否拥有ClassTag 执行某些操作。

    但是对于您的具体示例:A 中的xB 中的ClassTag 都不是字段,它们只是构造函数参数,它们不存储在实例的任何位置。要更改此设置,您可以将其声明为 val

    class A(private val x: Int)
    class B[T]()(private val tag: ClassTag[T])
    

    或确保它们在构造函数之外的主体中的某处使用。

    【讨论】:

    • 谢谢,但我的问题是,如果我们不能修改类,还有什么方法可以获取 ClassTag 值吗?不确定 scala 在进行序列化时如何处理它......
    • 正如我所说,不是这个特定的B。它也适用于标准序列化:ClassTag 不是首先要序列化的......
    猜你喜欢
    • 2018-04-28
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多