package Ġnet . challenge . config u . scanner Ċ Ċ import Ġnet . challenge . config u . container . IS ave Container Ċ import Ġnet . challenge . config u . value . V Tag Ċ import Ġnet . challenge . config u . value . Value Ċ import Ġjava . lang . reflect . Field Ċ import Ġjava . util . ArrayList Ċ Ċ /** Ċ Ġ* Ġ# ĠValue Scanner Ċ Ġ* ĠUsing Ġthe Ġ[ Value Scanner ] Ġyou Ġcan Ġfind Ġall Ċ Ġ* Ġvalues Ġin Ġa Ġ[ IS ave Container ] Ġand Ġreturn Ġas Ġa Ġ[ List ]. Ċ Ġ*/ Ċ object ĠValue Scanner Ġ: ĠI Value Scanner { ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġmethod Ġsearches Ġfor Ġvalues Ġin Ġthe Ġobject Ġand Ġthe Ġsuper classes Ġof Ġthe Ġobject . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġobj ĠObject Ġto Ġbe Ġsearched Ġfor Ġvalues ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġfind Values ( obj : ĠAny ): ĠList < Value < *, Ġ* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠArrayList < Value < *, Ġ* >>() ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Class : ĠClass < *> ? Ġ= Ġobj . java Class ĊĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Class !!. name Ġ== Ġ" java . lang . Object ") Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . addAll ( find Values ( obj , Ġcurrent Class )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Class Ġ= Ġcurrent Class . super class ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( current Class Ġ!= Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġvalues ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġmethod Ġsearches Ġfor Ġvalues Ġin Ġthe Ġclass Ġof Ġthe Ġhandler . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġobj ĠObject Ġto Ġscanning . ĊĠĠĠĠ Ġ* Ġ@ param Ġclazz ĠClass Ġto Ġsearch Ġfor Ġvalues . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠList Ġof Ġall Ġfo unded Ġvalues . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfind Values ( obj : ĠAny , Ġclazz : ĠClass < *> ): ĠList < Value < *, Ġ* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġclazz . declared Fields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġhas Tag ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġfield Ġ-> Ġfield To Value ( obj , Ġfield ) Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġfrom Ġthe Ġobject Ġthe Ġ[ Value ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġobj ĠThe Ġobj Ġin Ġwhich Ġthe Ġvalue Ġis . ĊĠĠĠĠ Ġ* Ġ@ param Ġfield ĠThe Ġfield Ġfrom Ġthe Ġvalue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe ĠValue Ġfrom Ġthe Ġfield ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfield To Value ( obj : ĠAny , Ġfield : ĠField ): ĠValue < *, Ġ*> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġget Field ( obj , Ġfield ) Ġ?: Ġthrow ĠRuntimeException (" Value Ġis ĠNull ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ! is ĠValue < *, Ġ* >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" The Ġfield Ġis Ġnot Ġa ĠValue ") ĊĊĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġget Tag ( field ) !! ĊĊĠĠĠĠĠĠĠ Ġvalue . name Ġ= Ġtag . name ĊĠĠĠĠĠĠĠ Ġvalue . description Ġ= Ġtag . description ĊĊĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġ[ Value ] Ġof Ġa Ġfield Ġfrom Ġan ĠObject . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġobj ĠObject Ġthat Ġfield Ġbelongs Ġto . ĊĠĠĠĠ Ġ* Ġ@ param Ġfield Ġ ĠField Ġthat Ġis Ġbeing Ġretrieved . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġvalue Ġof Ġthe Ġfield ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Field ( obj : ĠAny , Ġfield : ĠField ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġvalue : ĠAny ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccessible Ġ= Ġfield . is Accessible ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġfield [ obj ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . is Accessible Ġ= Ġaccessible ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġor Ġnot Ġthe Ġspecified Ġfield ĊĠĠĠĠ Ġ* Ġhas Ġa Ġ[ V Tag ] Ġannotation Ġor Ġnot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfield ĠField Ġbeing Ġchecked ĊĠĠĠĠ Ġ* Ġ@ return ĠIf Ġthe Ġfield Ġhas Ġa Ġ[ V Tag ] Ġannotation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhas Tag ( field : ĠField ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Tag ( field ) Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġclass Ġof Ġthe Ġvalue Ġannotation Ġbelong ing ĊĠĠĠĠ Ġ* Ġto Ġa Ġfield , Ġnull Ġif Ġthere Ġis Ġnone ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfield ĠField Ġbeing Ġchecked ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġ[ V Tag ] Ġannotation Ġof Ġthe Ġfield ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Tag ( field : ĠField ): ĠV Tag ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfield . getAnnotation ( V Tag :: class . java ) ĊĠĠĠ Ġ} Ċ }