package Ġio . mock k . impl . recording Ċ Ċ import Ġio . mock k . Mock K Gateway Ċ import Ġio . mock k . impl . log . Logger Ċ import Ġkotlin . reflect . K Class Ċ Ċ class ĠJ vm Auto H inter Ġ: ĠAuto H inter () Ġ{ ĊĠĠĠ Ġval Ġchild Types Ġ= Ġmutable Map Of < Int , ĠK Class <* >>() ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġauto Hint ( ĊĠĠĠĠĠĠĠ Ġcall Recorder : ĠMock K Gateway . Call Recorder , ĊĠĠĠĠĠĠĠ Ġi : ĠInt , ĊĠĠĠĠĠĠĠ Ġn : ĠInt , ĊĠĠĠĠĠĠĠ Ġblock : Ġ() Ġ-> ĠT ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcalls Passed Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Recorder . round ( i , Ġn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Types . forEach Ġ{ Ġ( call N , Ġcls ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Recorder . hint Next ReturnType ( cls , Ġcall N ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠClass CastException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcls Name Ġ= Ġextract ClassName ( ex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Calls Ġ= Ġcall Recorder . n Calls () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n Calls Ġ<= Ġcalls Passed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Recorder . discard Last Call Round () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalls Passed Ġ= Ġn Calls ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcls Ġ= ĠClass . forName ( cls Name ). kotlin ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" Auto Ġhint Ġfor Ġ$ n Calls - th Ġcall : Ġ$ cls " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Types [ n Calls ] Ġ= Ġcls ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract ClassName ( ex : ĠClass CastException ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġex . message ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Message . find ( it )?. groups ?. get ( 3 )?. value ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow Ġex ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠJDK Ġ 8 : Ġnet . byte buddy . re named . java . lang . Object $ Byte Bu ddy $ As 2 9 ns Jf $ Byte Bu ddy $ 8 7 7 l 7 O 7 D Ġcannot Ġbe Ġcast Ġto Ġio . mock k . impl . recording . states . Call Recording State ĊĠĠĠĠĠĠĠ Ġ// ĠJDK Ġ 9 : ĊĠĠĠĠĠĠĠ Ġ// ĠJDK Ġ 1 0 : ĊĠĠĠĠĠĠĠ Ġ// ĠJDK Ġ 1 1 : Ġclass Ġnet . byte buddy . re named . java . lang . Object $ Byte Bu ddy $ r pyc Q EY o $ Byte Bu ddy $ b HE k 1 AD Y Ġcannot Ġbe Ġcast Ġto Ġclass Ġjava . lang . String Ġ( net . byte buddy . re named . java . lang . Object $ Byte Bu ddy $ r pyc Q EY o $ Byte Bu ddy $ b HE k 1 AD Y Ġis Ġin Ġun named Ġmodule Ġof Ġloader Ġnet . byte buddy . dynamic . loading . ByteArray ClassLoader Ġ@ 1 9 5 6 9 ebd ; Ġjava . lang . String Ġis Ġin Ġmodule Ġjava . base Ġof Ġloader Ġ' bootstrap ') ĊĠĠĠĠĠĠĠ Ġval Ġexception Message Ġ= ĠRegex (" cannot Ġbe Ġcast Ġto Ġ( class Ġ) ?( .+ /) ?( .+ ? )( Ġ\\ (( . +) \\ )) ?$ ") ĊĊĠĠĠĠĠĠĠ Ġval Ġlog Ġ= ĠLogger < Jvm Auto H inter >() ĊĠĠĠ Ġ} Ċ }