我需要编写一个泛型方法来获取一个对象的所有字段及其值,这个对象的类可能包含ClassTag,所以我们应该找到一种方法来获取它,有什么好方法吗?难点是我们不知道前面的类,它可能包含ClassTag(零到多),它可能没有。
例如,
class A(x : Int) {}
a = new A(1)
我们应该输出x => 1
class B[T: ClassTag]() {}
b = new B[Float]()
我们应该输出_ $ 1 = Float
答案 0 :(得分:1)
def fields(obj: AnyRef) = obj.getClass.getDeclaredFields.map(field => (field.getName, field.get(obj))
将为您提供一系列字段名称和相应的值,您可以按照所需的格式进行按键。您可以测试类型并执行某些操作,具体取决于您是否有ClassTag
。
但是对于您的具体示例:x
中的A
和ClassTag
中的B
都不是字段,它们只是构造函数参数,不会存储在任何位置在实例中。要更改此设置,您可以将其声明为val
:
class A(private val x: Int)
class B[T]()(private val tag: ClassTag[T])
或确保它们在构造函数外部的某个位置使用。