vendredi 23 janvier 2015

scala: reflection on an inner class of abstract type

I want to reflect an inner class of abstract type in a trait. Something like this:



import scala.reflect.runtime.{ universe => ru }
import scala.reflect.ClassTag
import scala.reflect.api.JavaUniverse
import scala.collection.mutable.HashMap


trait SimElement {
type Probe
var probe: Probe

def reflectProbe(implicit ev1: scala.reflect.runtime.universe.TypeTag[Probe]) {
val runtimeMirror: ru.type#Mirror = ru.runtimeMirror(this.probe.getClass.getClassLoader)
val instanceMirror = runtimeMirror.reflect(this.probe.getClass())


val fieldTerm: ru.type#TermName = ru.TermName("name")
println(fieldTerm.toString())
val fieldSymbol = ru.typeOf[Probe].decl(fieldTerm)
println(fieldSymbol.toString())
}


}


class WorldProbe {
var population: Long = 8000000000L
}

class World extends SimElement {
type Probe = WorldProbe
var probe: Probe = new WorldProbe
}


class CountryProbe {
// to be set for every country
var population: Int = 0

// to be set for every country
var name: String = ""
}

class Country extends SimElement {
type Probe = CountryProbe
var probe: Probe = new CountryProbe
}

// ...


val elements: List[SimElement] = List(new World, new Country)

var countries: List[SimElement] = List()
var c1: Country = new Country
c1.probe.name = "Germany"
c1.probe.population = 81000000

var c2: Country = new Country
c2.probe.name = "Netherlands"
c2.probe.population = 16000000

countries = countries.+:(c1)
countries = countries.+:(c2)

elements.foreach { (s: SimElement) => s.reflectProbe }
countries.foreach { (s: SimElement) => s.reflectProbe }


This compiles, but it dosen't work as expected, it prints: name < none > name < none > name < none > name < none >


I think I'm not getting my hand on the "right" object here, however, researching quite a bit did not lead to an answer. Any help?


Thanks!






Aucun commentaire:

Enregistrer un commentaire