package Ġcom . labs 6 4 . net lic ensing . util Ċ Ċ import Ġjava . lang . reflect . Method Ċ Ċ open Ġclass ĠVisitor Ġ{ ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġvisit ( any : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġget Method ( any . java Class ) ĊĠĠĠĠĠĠĠ Ġmethod . invoke ( this , Ġany ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit Default ( any : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnothing ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( NoSuch Method Exception :: class ) ĊĠĠĠ Ġprotected Ġfun Ġget Method ( target Class : ĠClass < *> ): ĠMethod Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠsuperClass Ġ= Ġtarget Class ĊĠĠĠĠĠĠĠ Ġwhile Ġ( super Class Ġ!= ĠAny :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġjava Class . getMethod (" visit ", ĠsuperClass ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsuperClass Ġ= ĠsuperClass . super class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġif aces Ġ= Ġtarget Class . interfaces ĊĠĠĠĠĠĠĠ Ġfor Ġ( iface Ġin Ġif aces ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġjava Class . getMethod (" visit ", Ġiface ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġjava Class . getMethod (" visit Default ", ĠAny :: class . java ) ĊĠĠĠ Ġ} Ċ }