从泛型类中获取类名和属性名

时间:2017-02-12 15:13:11

标签: scala reflection

请考虑以下代码:

trait GeneralTrait[T] {
   def getClassName() = ???
   def params() = ???
}

case class SomeClass(id: Long, name: String)

class ConcreteClass extends GeneralTrait[SomeClass]

是否可以让getClassName()返回字符串'SomeClass'并使params()返回列表['id', 'name']

2 个答案:

答案 0 :(得分:3)

嗯......我不确定你究竟想做什么。

但是,你可以实现以下大部分内容,

trait GeneralTrait { self =>
  def getClassName() = self.getClass.getSimpleName

  def params() = self.getClass.getConstructors.apply(0).getParameters
}

case class SomeClass(id: Long, name: String) extends GeneralTrait

val sc = SomeClass(5, "some")

sc.getClassName()
//res0: String = SomeClass

sc.params()
//res1: Array[java.lang.reflect.Parameter] = Array(final A$A55$A$A55 $outer, final long id, final java.lang.String name)

答案 1 :(得分:3)

我建议你总是使用scala反射代替java反射。在编译期间,类和方法的名称往往会出现乱码。 Java并不知道scala,所以它总会给你带来乱码。

如果您需要有关类型参数的信息,则无论如何都必须使用scala反射。

.container {
    background-color: red;
    width:  20px;
    height: 20px;
}
.outlined {
    border: 3px solid blue;
    background-color: green;
    width:  100%;
    height: 100%;   
}