我需要编写一个通用方法来获取对象的所有字段及其值,该对象的类可能包含ClassTag,所以我们也应该找到一种方法来获取它,有什么好的方法吗?困难是我们不知道前面的类,它可能包含 ClassTag(从零到多个),也可能不包含。
例如,
class A(x : Int) {}
a = new A(1)
我们应该输出 x => 1
class B[T: ClassTag]() {}
b = new B[Float]()
我们应该输出 _$1 = Float
我需要编写一个通用方法来获取对象的所有字段及其值,该对象的类可能包含ClassTag,所以我们也应该找到一种方法来获取它,有什么好的方法吗?困难是我们不知道前面的类,它可能包含 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))
将为您提供一对字段名称和相应值的数组,您可以将其按摩成您想要的格式。您可以测试类型并根据您是否有 a 来做一些事情ClassTag
。
但是对于您的具体示例:x
inA
和ClassTag
inB
都不是字段,它们只是构造函数参数,不存储在实例的任何位置。要更改这一点,您可以将其声明为val
:
class A(private val x: Int)
class B[T]()(private val tag: ClassTag[T])
或确保它们在构造函数之外的身体某处使用。