0

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

例如,

class A(x : Int) {}

a = new A(1)

我们应该输出 x => 1

class B[T: ClassTag]() {}

b = new B[Float]()

我们应该输出 _$1 = Float

4

1 回答 1

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

将为您提供一对字段名称和相应值的数组,您可以将其按摩成您想要的格式。您可以测试类型并根据您是否有 a 来做一些事情ClassTag

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

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

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

于 2017-11-28T09:16:30.737 回答