package Ġcom . cat . plugin Ċ Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . lang . reflect . Type Ċ import Ġjavax . lang . model . element . Element Kind Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Variable Element Ċ import Ġjavax . lang . model . type . Type Mirror Ċ Ċ object ĠA sm Utils Ġ{ ĊĊĠĠĠ Ġval Ġis Android : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġis Android ( System . getProperty (" java . vm . name ")) ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprintln ( Asm Utils . get Desc ( System :: class . java )) ĊĠĠĠĠĠĠĠ Ġprintln ( Asm Utils . get Desc ( String :: class . java )) ĊĠĠĠĠĠĠĠ Ġprintln ( Asm Utils . get Desc ( Int :: class . java )) ĊĠĠĠĠĠĠĠ Ġprintln ( Asm Utils . get Desc ( Int :: class . java Primitive Type !! )) ĊĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= ĠA sm Utils :: class . java . getDeclared Method (" main ", ĠArray < String >:: class . java ) ĊĠĠĠĠĠĠĠ Ġprintln (" java h Ġ- jni ") ĊĠĠĠĠĠĠĠ Ġprintln ( Asm Utils . get Desc ( method )) ĊĠĠĠĠĠĠĠ Ġprintln ( Asm Utils . getType ( System :: class . java )) ĊĠĠĠĠĠĠĠ Ġprintln ( Asm Utils . getType ( Asm Utils :: class . java )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Android ( vm Name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlower VM Name Ġ= Ġvm Name . toLowerCase () ĊĠĠĠĠĠĠĠ Ġreturn Ġlower VM Name . contains (" dal vik ") Ġ|| Ġlower VM Name . contains (" lem ur ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Desc ( method : ĠMethod ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠStringBuffer () ĊĠĠĠĠĠĠĠ Ġbuf . append (" (" ) ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġmethod . parameter Types ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġtypes . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . append ( get Desc ( types [ i ])) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuf . append (" )") ĊĠĠĠĠĠĠĠ Ġbuf . append ( get Desc ( method . returnType )) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuf . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Desc ( returnType : ĠClass < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( returnType . is Primitive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Primitive Letter ( returnType ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( returnType . isArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"[" Ġ+ Ġget Desc ( returnType . component Type ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ" L " Ġ+ ĠgetType ( returnType ) Ġ+ Ġ";" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetType ( parameter Type : ĠClass < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parameter Type . isArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"[" Ġ+ Ġget Desc ( parameter Type . component Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! parameter Type . is Primitive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcls Name Ġ= Ġparameter Type . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcls Name . replace ("\\ .". to Regex (), Ġ"/") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġget Primitive Letter ( parameter Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Primitive Letter ( type : ĠClass < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Integer . TYPE Ġ== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" I " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Void . TYPE Ġ== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" V " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( java . lang . Boolean . TYPE Ġ== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Z " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Character . TYPE Ġ== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" C " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( java . lang . Byte . TYPE Ġ== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" B " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( java . lang . Short . TYPE Ġ== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" S " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( java . lang . Float . TYPE Ġ== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" F " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( java . lang . Long . TYPE Ġ== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" J " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( java . lang . Double . TYPE Ġ== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" D " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Type : Ġ" Ġ+ Ġtype . canonical Name Ġ+ Ġ" Ġis Ġnot Ġa Ġprimitive Ġtype ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget MethodType ( clazz : ĠClass <* >, ĠmethodName : ĠString ): ĠType ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġclazz . getMethod ( methodName , Ġ* array Of Null s < Class < *> >( 0 ) Ġas ĠArray < Class <* >>) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmethod . generic ReturnType ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget FieldType ( clazz : ĠClass <* >, ĠfieldName : ĠString ): ĠType ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġclazz . getField ( fieldName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield . generic Type ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget MethodDescriptor ( method : ĠExec utable Element ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( method . kind Ġ!= ĠElement Kind . METHOD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( method . simple Name . toString () Ġ+ Ġ" is Ġnot Ġa Ġmethod ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparameters : ĠList < Variable Element > Ġ= Ġmethod . parameters ĊĠĠĠĠĠĠĠ Ġval ĠreturnType : ĠType Mirror Ġ= Ġmethod . returnType ĊĠĠĠĠĠĠĠ Ġval ĠstringBuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ ĠstringBuilder . append (' (' ) ĊĠĠĠĠĠĠĠ Ġparameters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Descriptor ( string Builder , Ġit . as Type (). toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠstringBuilder . append (' )') ĊĠĠĠĠĠĠĠ Ġappend Descriptor ( string Builder , ĠreturnType . toString ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠstringBuilder . toString () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġappend Descriptor ( string Builder : ĠStringBuilder , Ġname : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtemp Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġwhile Ġ( temp . endsWith (" [] ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ġ= Ġtemp . substring ( 0 , Ġtemp . length Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ('[ ') ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( temp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" int " Ġ-> ĠstringBuilder . append (' I ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" void " Ġ-> ĠstringBuilder . append (' V ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" boolean " Ġ-> ĠstringBuilder . append (' Z ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" byte " Ġ-> ĠstringBuilder . append (' B ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" char " Ġ-> ĠstringBuilder . append (' C ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" short " Ġ-> ĠstringBuilder . append (' s ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" double " Ġ-> ĠstringBuilder . append (' D ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" float " Ġ-> ĠstringBuilder . append (' F ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" long " Ġ-> ĠstringBuilder . append (' J ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append (' L ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Length Ġ= Ġtemp . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġname Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcar Ġ= Ġtemp [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ( if Ġ( car Ġ== Ġ'.') Ġ'/' Ġelse Ġcar ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append (' ; ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ