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
中的 x
和 B
中的 ClassTag
都不是字段,它们只是不存储在任何地方的构造函数参数在实例中。要更改它,您可以将其声明为 val
:
class A(private val x: Int)
class B[T]()(private val tag: ClassTag[T])
或者确保它们在构造函数之外的主体中的某处使用。
我需要写一个通用的方法来获取一个对象的所有字段及其值,这个对象的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
中的 x
和 B
中的 ClassTag
都不是字段,它们只是不存储在任何地方的构造函数参数在实例中。要更改它,您可以将其声明为 val
:
class A(private val x: Int)
class B[T]()(private val tag: ClassTag[T])
或者确保它们在构造函数之外的主体中的某处使用。