我试图获取引用自定义类的属性类型,我只是得到它的类型为Object
我的代码:
class Edge[N <% Node](var from : N, var to : N) {
def toXml(c: Class): xml.Elem = {
<edge>{
for(field: Field <- classOf[this.type].getDeclaredFields)
yield <field name={field.name} tpe={field.tpe.toString()}>{ this.getClass().getMethods.find(_.getName() == field.name).get.invoke(this) }</field>
}</edge>
}
所以这里的问题是我需要在java Field和scala字段之间切换:显然scala中没有this.getClass这样的东西?所以我需要通过Java来获得课程? 然而,这似乎只导致对象作为类型?
答案 0 :(得分:1)
编辑:修改后的问题是:是否应该使用scala.reflect.Field或java.lang.reflect.Field?
答案:始终[*]使用java.lang.reflect.Field,一般来说java反射有两个原因:
/** This type is required by the compiler and <b>should not be used in client code</b>. */
case class Field(override val fullname: String, tpe: Type) extends GlobalSymbol(fullname)
[*]至少现在。反思即将到来斯卡拉。
- 原始答案:
如果您发布了类代码也会有所帮助,但似乎该字段被声明为Object。 getType返回字段的声明类。
返回一个Class对象,该对象标识字段的声明类型 由此Field对象表示。
class Foo {
var bar: String = "string"
var bar2: java.lang.Object = "string"
}
for (field <- new Foo().getClass.getDeclaredFields()) {
println("field=" + field.getName() + " " + field.getType.toString())
}
给出
field=bar class java.lang.String
field=bar2 class java.lang.Object
如果你想要实例的类型,那么你必须以正常的方式在实例上做一个.getClass()。