2014-09-21 2 views
2

Это пример использования загрузчика классов, и вы можете увидеть результат. Почему стоят загрузчики классов obj и obj2? Я знаю об идее «делегат к родительскому загрузчику классов».Classloader в JVM

public class jvm_77{ 

    public static void main(String[] args) throws Exception{ 
     ClassLoader myLoader = new ClassLoader(){ 

      public Class<?> loadClass(String name) throws ClassNotFoundException{ 
       try 
       { 
        String fileName = name.substring(name.lastIndexOf(".")+1)+".class"; 
        InputStream is = getClass().getResourceAsStream(fileName); 
        if(is == null) 
        { 
         return super.loadClass(name); 
        } 
        byte[] b = new byte[is.available()]; 
        is.read(b); 
        return defineClass(name,b,0,b.length); 
       }catch(IOException e) 
       { 
        throw new ClassNotFoundException(name); 
       } 
      } 

     }; 

     Object obj = myLoader.loadClass("Chapter7_ClassLoader.jvm_77").newInstance(); 
     jvm_77 obj2 = new jvm_77(); 

     System.out.println(obj.getClass().getClassLoader()); //[email protected] 
     System.out.println(obj2.getClass().getClassLoader()); //[email protected] 

     System.out.println(obj.equals(obj2));//false 
     System.out.println(obj instanceof Chapter7_ClassLoader.jvm_77);//false 
     System.out.println(obj2 instanceof Chapter7_ClassLoader.jvm_77);//true 
    } 

} 

ответ

2

Почему OBJ в загрузчик классов и загрузчик классов obj2 различны?

Эта строка создает экземпляр класса jvm_77, который был загружен стандартным загрузчиком классов.

jvm_77 obj2 = new jvm_77(); 

Эта строка создает экземпляр класса jvm_77, который был расположен на пользовательском загрузчиком классов.

Object obj = myLoader.loadClass("Chapter7_ClassLoader.jvm_77").newInstance(); 

Так в основном, то, что вы спрашиваете, почему эти два подхода не дают один и тот же объект Class. И ответ на этот вопрос в том, что вы реализовали loadClass в вас загрузчике классов:

  • поведение по умолчанию для метода loadClass является:

    1. Попробуйте родительский загрузчик
    2. Если это не удается , проверьте, если мы уже загрузили класс
    3. Если это не удается, найдите ресурс и загрузите класс.
  • loadClass метод вашего ClassLoader в делает это:

    1. Попытки найти ресурс
    2. Если находка ресурса преуспевает, загрузить ресурс
    3. Если находке ресурса не удается, попробуйте родительский загрузчик классы.

Очевидно, что пользовательский загрузчик классов будет попытка определить новый класс ... если это возможно. И, судя по всему, он преуспевает.


Короче говоря, загрузчики классов отличаются на выходе из-за того, как вы реализован методом loadClass.

Смежные вопросы