package Ġcom . sup . dev . java . libs . an at ations Ċ Ċ import Ġjava . io . File Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . jar . Jar File Ċ Ċ object ĠTools An at ations Ġ{ ĊĊĠĠĠ Ġfun Ġfind Annotated Classes ( an : ĠClass < out ĠAnnotation >, Ġfile : ĠFile ): ĠArrayList < Class <* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= ĠArrayList < Class <* >>() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Directory ("", Ġfile , Ġan , Ġret ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Jar ( file , Ġan , Ġret ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscan Directory ( pkg : ĠString , Ġdir : ĠFile , Ġan : ĠClass < out ĠAnnotation >, Ġentries : ĠArrayList < Class <* >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontents Ġ= Ġdir . list Files () ĊĠĠĠĠĠĠĠ Ġfor Ġ( f Ġin Ġcontents ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Directory ( if Ġ( pkg . length Ġ> Ġ 0 ) Ġpkg Ġ+ Ġ'. '. toString () Ġ+ Ġf . name Ġelse Ġf . name , Ġf , Ġan , Ġentries ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( f . name . endsWith (". class ") Ġ|| Ġf . name . endsWith (". java ") Ġ|| Ġf . name . endsWith (". kt ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcl Name Ġ= Ġpkg Ġ+ Ġ'. '. toString () Ġ+ Ġf . name . split ("\\ .". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array ()[ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcl Ġ= ĠThread . currentThread (). context ClassLoader . load Class ( cl Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cl . is Annotation Present ( an ) Ġ&& Ġ! entries . contains ( cl )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentries . add ( cl ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠThrowable ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscan Jar ( file : ĠFile , Ġan : ĠClass < out ĠAnnotation >, Ġret : ĠArrayList < Class <* >>) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJar File ( file ). use Ġ{ Ġjar Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġjar . entries () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( entries . hasMore Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġentries . nextElement () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . name . endsWith (". class ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġentry . name . substring ( 0 , Ġentry . name . length Ġ- Ġ 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname . replace ('/', Ġ'.') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcl Ġ= ĠThread . currentThread (). context ClassLoader . load Class ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cl . is Annotation Present ( an ) Ġ&& Ġ! ret . contains ( cl )) Ġret . add ( cl ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠThrowable ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠThrowable ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }