package Ġu y . kl utter . core . jdk Ċ Ċ import Ġjava . io . InputStream Ċ import Ġjava . net . URL Ċ import Ġjava . net . URL ClassLoader Ċ import Ġjava . util .* Ċ Ċ // Ġborrow ed Ġfrom ĠK TOR Ċ // ĠĠ Ġhttps :// github . com / Kotlin / ktor / blob / fd 9 9 5 1 2 bf 8 e 2 0 7 fef 7 af 5 ae 6 5 2 1 f 8 7 1 ea 9 d 2 fa 7 b / ktor - core / src / org / jetbrains / ktor / host / Over riding ClassLoader . kt Ċ // Ġprobably Ġoriginally Ġfrom : Ċ // ĠĠ Ġhttps :// d zone . com / articles / java - class loader - handling Ċ // Ġthen Ġupdated Ġto Ġfix Ġresource Ġloading Ċ Ċ /** Ċ Ġ* ĠA Ġparent - last Ġclass loader Ġthat Ġwill Ġtry Ġthe Ġchild Ġclass loader Ġfirst Ġand Ġthen Ġthe Ġparent . Ċ Ġ*/ Ċ class ĠChild First Class loader ( classpath : ĠList < URL >, Ġparent ClassLoader : ĠClassLoader ?) Ġ: ĠClassLoader ( parent ClassLoader ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġchild ClassLoader Ġ= ĠChild URL ClassLoader ( classpath . to Typed Array (), Ġparent ) ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġload Class ( name : ĠString , Ġresolve : ĠBoolean ): ĠClass < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfirst Ġwe Ġtry Ġto Ġfind Ġa Ġclass Ġinside Ġthe Ġchild Ġclass loader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchild ClassLoader . find Class ( name ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdidn 't Ġfind Ġit , Ġtry Ġthe Ġparent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . load Class ( name , Ġresolve ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Class ( name : ĠString ): ĠClass < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġload Class ( name , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Class ( name : ĠString ): ĠClass < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchild ClassLoader . find Class ( name ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġnop Ġ*/ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . find Class ( name ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġclass Ġdeleg ates Ġ( child Ġthen Ġparent ) Ġfor Ġthe Ġfind Class Ġmethod Ġfor Ġa ĠURL ClassLoader . ĊĠĠĠĠ Ġ* ĠWe Ġneed Ġthis Ġbecause Ġfind Class Ġis Ġprotected Ġin ĠURL ClassLoader ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġclass ĠChild URL ClassLoader ( urls : ĠArray < URL >, Ġprivate Ġval Ġreal Parent : ĠClassLoader ) Ġ: ĠURL ClassLoader ( urls , Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġfind Class ( name : ĠString ): ĠClass < *> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloaded Ġ= Ġsuper . find Loaded Class ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loaded Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġloaded ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfirst Ġtry Ġto Ġuse Ġthe ĠURL ClassLoader Ġfind Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . find Class ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthat Ġfails , Ġwe Ġask Ġour Ġreal Ġparent Ġclass loader Ġto Ġload Ġthe Ġclass Ġ( we Ġgive Ġup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreal Parent . load Class ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Resource ( name : ĠString ): ĠURL ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġchild ClassLoader . find Resource ( name ) Ġ?: Ġsuper . find Resource ( name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetResource ( name : ĠString ): ĠURL ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġchild ClassLoader . getResource ( name ) Ġ?: Ġsuper . getResource ( name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠUrl Enumeration ( val Ġiter : ĠIterator < URL >): ĠEnumeration < URL > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext Element (): ĠURL Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġiter . next () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas More Elements (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġiter . hasNext () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Resources ( name : ĠString ): ĠEnumeration < URL > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcombined Ġ= Ġchild ClassLoader . find Resources ( name ). as Sequence () Ġ+ Ġsuper . find Resources ( name ). as Sequence () ĊĠĠĠĠĠĠĠ Ġreturn ĠUrl Enumeration ( combined . iterator ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Resources ( name : ĠString ): ĠEnumeration < URL > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcombined Ġ= Ġchild ClassLoader . getResources ( name ). as Sequence () Ġ+ Ġsuper . getResources ( name ). as Sequence () ĊĠĠĠĠĠĠĠ Ġreturn ĠUrl Enumeration ( combined . iterator ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetResource AsStream ( name : ĠString ): ĠInputStream ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġchild ClassLoader . getResource AsStream ( name ) Ġ?: Ġsuper . getResource AsStream ( name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Class Assertion Status ( className : ĠString ?, Ġenabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchild ClassLoader . set Class Assertion Status ( className , Ġenabled ) ĊĠĠĠĠĠĠĠ Ġsuper . set Class Assertion Status ( className , Ġenabled ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear Assertion Status () Ġ{ ĊĠĠĠĠĠĠĠ Ġchild ClassLoader . clear Assertion Status () ĊĠĠĠĠĠĠĠ Ġsuper . clear Assertion Status () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetDefault Assertion Status ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchild ClassLoader . setDefault Assertion Status ( enabled ) ĊĠĠĠĠĠĠĠ Ġsuper . setDefault Assertion Status ( enabled ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Package Assertion Status ( packageName : ĠString , Ġenabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchild ClassLoader . set Package Assertion Status ( packageName , Ġenabled ) ĊĠĠĠĠĠĠĠ Ġsuper . set Package Assertion Status ( packageName , Ġenabled ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠTODO : Ġshould Ġthese Ġbe Ġover rid en ? ĊĠĠĠ Ġ// Ġ Ġoverride Ġfun Ġget Packages (): ĠArray < out ĠPackage >? Ġ{ Ġ} ĊĠĠĠ Ġ// Ġ Ġoverride Ġfun Ġget Package ( name : ĠString ?): ĠPackage ? Ġ{ Ġ} ĊĠĠĠ Ġ// Ġ Ġoverride Ġfun Ġdefine Package ( name : ĠString ?, Ġspec Title : ĠString ?, Ġspec Version : ĠString ?, Ġspec Vendor : ĠString ?, Ġimpl Title : ĠString ?, Ġimpl Version : ĠString ?, Ġimpl Vendor : ĠString ?, Ġse al Base : ĠURL ?): ĠPackage ? Ġ{ Ġ} ĊĠĠĠ Ġ// Ġ Ġoverride Ġfun Ġadd Class ( c : ĠClass < *> ?) Ġ{ Ġ} ĊĠĠĠ Ġ// Ġ Ġoverride Ġfun ĠgetClass Loading Lock ( className : ĠString ?): ĠAny ? Ġ{ Ġ} Ċ }