scala reflection miss inherit class java annotation -
model code(partly):
@documented @retention(retentionpolicy.runtime) @target(elementtype.field) public @interface corefield { string mongotag() default ""; boolean needindex() default false; } trait packitemtrait { @beanproperty @corefield(mongotag = "num") var number: int = _ } class userresourcefragmentt_1 { @beanproperty @corefield(mongotag = "num") var number: int = _ } class userresourcefragmentt_2 extends packitemtrait { }
reflection code(partly):
val classname = "xxx.xxxx.userresourcefragmentt_1" // or userresourcefragmentt_2 fullnme val clzsymbol = mirror.staticclass(classname) val clztype = clzsymbol.totype clztype.members.foreach { each => if (each.isterm) { val eachterm = each.asterm println("eachterm:" + eachterm.name.decoded) println("isaccessor:" + eachterm.isaccessor) println("isgetter:" + eachterm.isgetter) println("issetter:" + eachterm.issetter) println("isvar:" + eachterm.isvar) println("isval:" + eachterm.isval) println("annotation size:" + eachterm.annotations.size) println("") if (eachterm.isvar || eachterm.isval) {
i test class userresourcefragmentt_1 , userresourcefragmentt_2. when reflect userresourcefragmentt_1, outprint annotation size 2, that's right, on other hand, when reflect userresourcefragmentt_2 inherit trait class packitemtrait, field number parse, print not previous model.
println:
userresourcefragmentt_1
[info] eachterm:number [info] isaccessor:false [info] isgetter:false [info] issetter:false [info] isvar:true [info] isval:false [info] annotation size:2 [info] eachterm:number_= [info] isaccessor:true [info] isgetter:false [info] issetter:true [info] isvar:false [info] isval:false [info] annotation size:0
userresourcefragmentt_2
[info] eachterm:number_= [info] isaccessor:true [info] isgetter:false [info] issetter:true [info] isvar:false [info] isval:false [info] annotation size:0 [info] eachterm:number [info] isaccessor:true [info] isgetter:true [info] issetter:false [info] isvar:false [info] isval:false [info] annotation size:0
i don't konw scala inherit mechanism... test packitemtrait abstract class, normal class, case class, result same: scala reflection api can not parse java annotation field inherit super class, 1 can me???
after research, find way go:
val mirror = ru.runtimemirror(thread.currentthread.getcontextclassloader) val clzsymbol = mirror.staticclass("xxx.xxx.userequipmentt") clzsymbol.baseclasses.filter( each => (each.name.decoded != "any" && each.name.decoded != "object") ).foreach { each => each.astype.totype.members.foreach { each => if (each.isterm) { val eachterm = each.asterm if (eachterm.isval || eachterm.isvar) { println("name:" + eachterm.name.decoded) println("annotation size:" + eachterm.annotations.size) } } } }
Comments
Post a Comment