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

Popular posts from this blog

apache - Remove .php and add trailing slash in url using htaccess not loading css -

javascript - jQuery show full size image on click -