Scala从类实例中获取classtag

时间:2017-11-28 08:39:03

标签: scala reflection classtag

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

例如,

class A(x : Int) {}

a = new A(1)

我们应该输出x => 1

class B[T: ClassTag]() {}

b = new B[Float]()

我们应该输出_ $ 1 = Float

1 个答案:

答案 0 :(得分:1)

def fields(obj: AnyRef) = obj.getClass.getDeclaredFields.map(field => (field.getName, field.get(obj))

将为您提供一系列字段名称和相应的值,您可以按照所需的格式进行按键。您可以测试类型并执行某些操作,具体取决于您是否有ClassTag

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

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

或确保它们在构造函数外部的某个位置使用。