java 기초 학습 노트 같은 캐리어

3860 단어 java클래스 로더
클래스 로더
자바 클래스 마운트는 실행할 때 JVM에서 필요한 클래스를 동적으로 마운트하는 것입니다. 자바 클래스 마운트는 세 가지 메커니즘을 바탕으로 합니다. 의뢰, 가시, 단일입니다.
classpath 밑에 있는 것들.class 파일이 메모리에 불러와서 처리되면 바이트 코드가 됩니다. 이 작업은 클래스 마운트가 합니다.
  • 의뢰 메커니즘은 부하 클래스의 요청을 아버지 부하 장치에 전달하는 것을 가리킨다. 만약에 아버지 부하 장치가 이 클래스를 찾을 수 없거나 불러올 수 없다면 다시 불러오는 것을 가리킨다
  • 가시성 메커니즘은 부모 캐리어가 탑재된 클래스는 모두 이불 캐리어가 볼 수 있지만 하위 캐리어가 탑재된 클래스는 아버지 캐리어가 보이지 않는다는 것을 가리킨다
  • 단일성 메커니즘은 한 종류가 같은 캐리어에 한 번만 불러올 수 있다는 것을 가리킨다.
  • 기본 클래스 로더
    시스템 기본 세 가지 클래스 로더:
  • BootStrap
  • ExtClassLoader
  • AppClassLoader
  • 클래스 캐리어도 자바 클래스이고 BootStrap은 아닙니다.인증 코드:
    
    public class ClassLoaderTest {
      public static void main(String[] args) {
        System.out.println(System.class.getClassLoader());
      }
    }
    
    출력:null
    시스템을 사용한다면.out.println(System.class.getClassLoader().toString);,그러면 빈 포인터 예외가 발생합니다.
    
    Exception in thread "main" java.lang.NullPointerException
      at com.iot.classloader.ClassLoaderTest.main(ClassLoaderTest.java:10)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:483)
      at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
    
    System 클래스는 BootStrap 클래스 로드기에 의해 로드됩니다.
    클래스 캐리어의 위탁 메커니즘
    클래스 캐리어의 트리 그래프
    클래스 로더
    일반 로드 클래스 순서:
  • 우선 현재 라인의 클래스 캐리어가 라인의 첫 번째 클래스를 불러옵니다
  • 클래스 A가 클래스 B를 적용하면java 가상 머신은 클래스 A를 불러오는 클래스 캐리어를 사용하여 클래스 B를 불러옵니다
  • ClassLoader를 직접 호출할 수도 있습니다.loadClass () 방법으로 클래스를 불러오는 클래스를 만듭니다.
  • 사용자 정의 클래스 캐리어의 작성 원리
    API:
    Class ClassLoader
    템플릿 방법 설계 모델
    상위 클래스:
    loadClass (클래스 로드 프로세스, 템플릿)
    findClass 하위 클래스가 덮어쓰는loadClass 방법으로 호출된 클래스 로딩 논리
    defineClass는class 파일을 바이트 코드로 변환합니다
    하위 클래스:findClass 덮어쓰기 방법
    예:
    loadClass 방법의 원본
    
    protected Class<?> loadClass(String name, boolean resolve)
      throws ClassNotFoundException
    {
      synchronized (getClassLoadingLock(name)) {
        // First, check if the class has already been loaded
        Class<?> c = findLoadedClass(name);
        if (c == null) {
          long t0 = System.nanoTime();
          try {
            if (parent != null) {
              c = parent.loadClass(name, false);
            } else {
              c = findBootstrapClassOrNull(name);
            }
          } catch (ClassNotFoundException e) {
            // ClassNotFoundException thrown if class not found
            // from the non-null parent class loader
          }
    
          if (c == null) {
            // If still not found, then invoke findClass in order
            // to find the class.
            long t1 = System.nanoTime();
            c = findClass(name);
    
            // this is the defining class loader; record the stats
            sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
            sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
            sun.misc.PerfCounter.getFindClasses().increment();
          }
        }
        if (resolve) {
          resolveClass(c);
        }
        return c;
      }
    }
    
    
    API 문서의 예:
    
    class NetworkClassLoader extends ClassLoader {
       String host;
       int port;
    
       public Class findClass(String name) {
         byte[] b = loadClassData(name);
         return defineClass(name, b, 0, b.length);
       }
    
       private byte[] loadClassData(String name) {
         // load the class data from the connection
         . . .
       }
     }
    

    좋은 웹페이지 즐겨찾기