Scala 从 class 个实例中获取 class 标签

Scala get classtag from class instance

我需要写一个通用的方法来获取一个对象的所有字段及其值,这个对象的class可能包含ClassTag,所以我们也应该想办法获取它,是吗好办法?困难在于我们不知道前面的 class,它可能包含 ClassTag(零到很多),也可能不包含。

例如,

class A(x : Int) {}

a = new A(1)

我们应该输出 x => 1

class B[T: ClassTag]() {}

b = new B[Float]()

我们应该输出 _$1 = Float

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

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