Class loader

Java Class Loader์™€ Dynamic Loading

Java์˜ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ์— ๋™์ ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ์ฝ์–ด์˜ค๋Š” Dynamic Loading์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ ์ฐธ์กฐ๋˜๋Š” ์ˆœ๊ฐ„ ๋™์ ์œผ๋กœ ๋กœ๋“œ ๋ฐ ๋งํฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. Dynamic Loading์€ Load Time Dynamic Loading๊ณผ Runtime Dynamic Loading์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

Load Time Dynamic Loading

Load Time Dynamic Loading์€ ํŠน์ • ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ๊ด€๋ จ๋œ ํด๋ž˜์Šค๋“ค์„ ํ•จ๊ป˜ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์˜ ์†Œ์Šค ์ฝ”๋“œ์—์„œ Hello ํด๋ž˜์Šค๋Š” String ๊ฐ์ฒด๋ฅผ main() ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, System ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ Hello ํด๋ž˜์Šค๊ฐ€ ClassLoader์— ์˜ํ•ด JVM์œผ๋กœ ๋กœ๋“œ๋  ๋•Œ java.lang.String ํด๋ž˜์Šค์™€ java.lang.System ํด๋ž˜์Šค๊ฐ€ ๋™์‹œ์— ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello EXEM");
    }
}

Runtime Dynamic Loading

Runtime Dynamic Loading์€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ˆœ๊ฐ„์— ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์†Œ์Šค ์ฝ”๋“œ๋Š” Hello ํด๋ž˜์Šค์—์„œ ํŠน์ • ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋‚ด์šฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ• ์ง€๋Š” ์ธ์ˆ˜๋กœ ๋„˜์–ด์˜จ ์ดํ›„์—๋‚˜ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, Class.forName(args[0])๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ˆœ๊ฐ„์— args[0]์— ํ•ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•  ์ˆ˜๋ฐ–์— ์—†๋Š” ์ƒํ™ฉ์ด ๋ฉ๋‹ˆ๋‹ค.

public class Hello {
    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> cl = Class.forName(args[0]);
    }
}

ClassLoader ์—ญํ• 

ClassLoader๋Š” JVM ๋‚ด๋กœ ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•˜๊ณ  ๋งํฌ๋ฅผ ํ†ตํ•ด ์ ์ ˆํžˆ ๋ฐฐ์น˜ํ•˜๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. JVM์€ ๋™์ผํ•œ ํด๋ž˜์Šค๋ฅผ ์ค‘๋ณตํ•ด์„œ ๋กœ๋“œํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค ๋กœ๋“œ ์ „์— ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ JVM์— ์ด๋ฏธ ๋กœ๋“œ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ํด๋ž˜์Šค๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

ClassLoader๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ ์ด ๋กœ๋“œํ•œ ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ClassLoader๊ฐ€ ๋กœ๋“œํ•œ ํด๋ž˜์Šค์˜ ํ’€ ๋„ค์ž„์„ ์ €์žฅํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด JVM์€ ๋™์ผํ•œ ํด๋ž˜์Šค๋ผ๋„ ์„œ๋กœ ๋‹ค๋ฅธ ClassLoader๊ฐ€ ๋กœ๋“œํ•œ ๊ฒฝ์šฐ ์ค‘๋ณต ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Class Loader Delegation Model

์—ฌ๋Ÿฌ ๊ฐœ์˜ ClassLoader๋Š” ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๊ฐ ClassLoader๋Š” ๋ถ€๋ชจ ClassLoader๋กœ๋ถ€ํ„ฐ ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•˜๋Š” ์ž‘์—…์„ ์œ„์ž„๋ฐ›์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, SystemClassLoader๊ฐ€ ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•˜๋„๋ก ์š”์ฒญ๋ฐ›์œผ๋ฉด ExtensionClassLoader์™€ BootstrapClassLoader๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค๋ฅผ ์ฐพ๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ ์ž์‹ ์ด ๋กœ๋“œ๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

Class Loader์˜ ์ข…๋ฅ˜

  • Bootstrap ClassLoader: ๊ฐ€์žฅ ์ƒ์œ„์˜ ClassLoader๋กœ, JVM ๊ธฐ๋™ ์‹œ ๊ฐ€์žฅ ๋จผ์ € ์ƒ์„ฑ๋˜๋ฉฐ ๊ธฐ๋ณธ Java API๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

  • Extension ClassLoader: Bootstrap ClassLoader๋ฅผ ๋ถ€๋ชจ๋กœ ํ•˜๋ฉฐ, ํ™•์žฅ ํด๋ž˜์Šค๋“ค์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

  • Application ClassLoader: ์‚ฌ์šฉ์ž ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ClassLoader๋กœ, CLASSPATH์— ์œ„์น˜ํ•œ ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

  • User Defined ClassLoader: ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ClassLoader์ž…๋‹ˆ๋‹ค.

Class Loader์˜ ๋™์ž‘ ๊ณผ์ •

Class Loader์˜ ๋™์ž‘ ๊ณผ์ •์€ ํฌ๊ฒŒ ์„ธ ๋‹จ๊ณ„๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค: ๋กœ๋“œ, ๋งํฌ, ์ดˆ๊ธฐํ™”.

  1. ๋กœ๋“œ(Loading):

    • ํด๋ž˜์Šค๋ฅผ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด๋‚˜ ๋„คํŠธ์›Œํฌ ๋“ฑ์—์„œ ๊ฐ€์ ธ์™€ JVM ๋‚ด๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    • ์˜ˆ: ํŒŒ์ผ ํ˜•ํƒœ์˜ ํด๋ž˜์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํš๋“ํ•˜์—ฌ JVM์— ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    • ์˜ˆ์ œ:

      public class CustomClassLoader extends ClassLoader {
          @Override
          public Class<?> findClass(String name) throws ClassNotFoundException {
              byte[] b = loadClassData(name);
              return defineClass(name, b, 0, b.length);
          }
      
          private byte[] loadClassData(String name) {
              // ํด๋ž˜์Šค ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋Š” ๋กœ์ง ๊ตฌํ˜„
              return new byte[0];
          }
      }
  2. ๋งํฌ(Linking):

    • ๊ฒ€์ฆ(Verification): ํด๋ž˜์Šค ํŒŒ์ผ์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ.

      • Final ํด๋ž˜์Šค๊ฐ€ ์Šˆํผํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ์ง€ ํ™•์ธ.

      • Final ํด๋ž˜์Šค๊ฐ€ ์˜ค๋ฒ„๋ผ์ด๋“œ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ.

      • ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ, ๊ตฌํ˜„๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ๊ตฌํ˜„๋˜์—ˆ๋Š”์ง€ ํ™•์ธ.

      • Constant Pool์˜ ์ •๋ณด๊ฐ€ ์ •ํ•ฉ์„ฑ์ด ๋งž๋Š”์ง€ ๊ฒ€์ฆ.

      • ๋ฐ”์ดํŠธ ์ฝ”๋“œ์˜ ์ •ํ•ฉ์„ฑ ๋ฐ ์™„์ „์„ฑ์„ ๊ฒ€์ฆ.

    • ์ค€๋น„(Preparation): ํด๋ž˜์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ ๊ธฐ๋ณธ ๊ฐ’ ์„ค์ •.

      • ๊ธฐ๋ณธ ๋ณ€์ˆ˜ ํƒ€์ž…๋ณ„๋กœ ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      • ์˜ˆ: int๋Š” 0, float๋Š” 0.0f, ์ฐธ์กฐํ˜•์€ null ๋“ฑ.

    • ํ•ด๊ฒฐ(Resolution): ์ƒ์ง•์  ์ฐธ์กฐ๋ฅผ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

      • Constant Pool์— ์žˆ๋Š” ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉ”์„œ๋“œ, ํ•„๋“œ์˜ ์ƒ์ง•์  ์ฐธ์กฐ๋ฅผ ์ง์ ‘ ์ฐธ์กฐ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. ์ดˆ๊ธฐํ™”(Initialization):

    • ํด๋ž˜์Šค ๋ณ€์ˆ˜๋ฅผ ์ ์ ˆํ•œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , <clinit>() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    • ํด๋ž˜์Šค์˜ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋Š” ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ง๊ณ„ ์Šˆํผํด๋ž˜์Šค๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜์œผ๋ฉด ๋จผ์ € ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๊ทธ ํ›„ ํด๋ž˜์Šค์˜ <clinit>() ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ดˆ๊ธฐํ™”๋ฅผ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

    • ์˜ˆ: public class Example { static { /* ์ดˆ๊ธฐํ™” ๋ธ”๋ก */ } }

Class Sharing

Java 5๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์œผ๋กœ, JVM์˜ ๊ฐ ํ”„๋กœ์„ธ์Šค ์‚ฌ์ด์—์„œ ๋กœ๋“œ๋œ ํด๋ž˜์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋Š” JVM์˜ ๊ธฐ๋™ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ JVM์ด ๋กœ๋“œํ•œ ํด๋ž˜์Šค๋ฅผ ๋‹ค๋ฅธ JVM์ด ๊ณต์œ ํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Class Sharing์˜ ๋™์ž‘ ๋ฐฉ์‹

  • ํ•œ JVM์ด rt.jar์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ํด๋ž˜์Šค ํŒŒ์ผ๋“ค์„ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•ด ๋†“์œผ๋ฉด, ๋‹ค๋ฅธ JVM์€ ์ด ๋กœ๋“œ๋œ ํด๋ž˜์Šค ํŒŒ์ผ๋“ค์„ ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ค„์ด๊ณ  JVM ๊ธฐ๋™ ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œํ‚ค๋Š” ๋ฐ ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค.

WAS์—์„œ์˜ Class Loader ๊ตฌ์„ฑ

Web Application Server(WAS)์—์„œ ClassLoader๋Š” ๋…๋ฆฝ์ ์ด๋ฉด์„œ๋„ ์—ฌ๋Ÿฌ ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„ ํด๋ž˜์Šค๊ฐ€ ์„ž์ด์ง€ ์•Š๋„๋ก ํ•˜๋ฉฐ, ๋ชจ๋“ˆ ๊ฐ„ ํด๋ž˜์Šค ๊ณต์œ ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

WebLogic๊ณผ JEUS์˜ Class Loader ๊ตฌ์กฐ

  • WebLogic: SystemClassLoader๊ฐ€ ์ตœ์ƒ์œ„ ClassLoader๋กœ, EJB ๋ชจ๋“ˆ๊ณผ WEB ๋ชจ๋“ˆ์˜ ๊ด€๊ณ„๋ฅผ ๊ณ ๋ฆฝ์‹œ์ผœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • EJB ๋ชจ๋“ˆ์€ WEB ๋ชจ๋“ˆ๋ณด๋‹ค ์ƒ์œ„์— ์œ„์น˜ํ•˜๋ฉฐ, ์„œ๋กœ ๋…๋ฆฝ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • JEUS: SharedClassLoader์™€ IsolatedClassLoader ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    • SharedClassLoader: ์ตœ๋Œ€ํ•œ ํด๋ž˜์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, EJB ๋ชจ๋“ˆ์ด Redeploy๋˜๋ฉด ๊ด€๋ จ๋œ ๋ชจ๋“  WEB ๋ชจ๋“ˆ์˜ ClassLoader๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • IsolatedClassLoader: ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋งˆ๋‹ค ๊ณ ๋ฆฝ๋œ ClassLoader ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์„ฑ๋Šฅ์ƒ์˜ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Class Loader ์˜ต์…˜

  • -Xbootclasspath: Bootstrap ClassLoader์˜ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ ์„ค์ •.

  • -Djava.ext.dirs: Extension ClassLoader์˜ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ ์„ค์ •.

  • -cp, -classpath: SystemClassLoader์˜ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ ์„ค์ •.

  • -XX:+TraceClassLoading: ๋กœ๋“œ๋œ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋””๋ฒ„๊น… ์˜ต์…˜.

  • -XX:+TraceClassUnloading: ์–ธ๋กœ๋“œ๋œ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์˜ต์…˜.

  • -XX:+TraceClassLoadingPreorder: ์ฐธ์กฐ ์ˆœ์„œ๋Œ€๋กœ ๋กœ๋“œ๋œ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์˜ต์…˜.

  • -XX:+TraceClassResolution: Constant Pool์˜ ํ•ด๊ฒฐ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์˜ต์…˜.

  • -XX:+TraceLoaderConstraints: ClassLoader์˜ ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•œ ๊ธฐ๋ก์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ต์…˜.

  • -XX:+LazyBootClassLoader: Bootstrap ClassLoader์˜ Classpath์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์„ Lazy ๋ฐฉ์‹์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ์˜ต์…˜.

JVM ์˜ต์…˜ ์˜ˆ์ œ

  • ๊ธฐ๋ณธ Java API๋ณด๋‹ค ๋จผ์ € ์ฝ์–ด๋“ค์ผ ๊ฒฝ๋กœ๋‚˜ ํŒŒ์ผ์„ ์„ค์ •:

    java -Xbootclasspath/p:<๊ฒฝ๋กœ> MyClass
  • SystemClassLoader์˜ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ ์„ค์ •:

    java -cp <๊ฒฝ๋กœ> MyClass
  • ํด๋ž˜์Šค ๋กœ๋“œ ๋ฐ ์–ธ๋กœ๋“œ ์ถ”์ :

    java -XX:+TraceClassLoading -XX:+TraceClassUnloading MyClass

User Defined ClassLoader ์˜ˆ์ œ

์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ClassLoader๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค ๋กœ๋“œ ๋™์ž‘์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public class CustomClassLoader extends ClassLoader {
    @Override
    public Class<?> findClass(String name) throws ClassNotFoundException {
        byte

[] b = loadClassData(name);
        return defineClass(name, b, 0, b.length);
    }

    private byte[] loadClassData(String name) {
        // ํด๋ž˜์Šค ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋Š” ๋กœ์ง ๊ตฌํ˜„
        return new byte[0];
    }
}

์ด์™€ ๊ฐ™์ด Java์˜ ClassLoader์™€ Dynamic Loading์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ , ์ด๋ฅผ ํ™œ์šฉํ•œ ๋‹ค์–‘ํ•œ ์„ค์ •๊ณผ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ํšจ์œจ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ClassLoader์˜ ๋™์ž‘ ์›๋ฆฌ์™€ ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ์ˆ™์ง€ํ•จ์œผ๋กœ์จ, Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ๊ณผ ์œ ์—ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Last updated

Was this helpful?