자바 의 클래스 로 더

6874 단어 로 더
자바 의 클래스 로 더 는 JRE 의 일부분 으로 클래스 를 JVM 에 동적 으로 불 러 옵 니 다.보통 클래스 가 필요 할 때 불 러 옵 니 다.로드 지연 에 속 합 니 다.클래스 로 더 가 존재 하기 때문에 자바 런 타임 은 파일 과 파일 시스템 을 알 필요 가 없습니다.
자바 의 형식 시스템 은 4 가지 유형,원본 형식(primitive),배열 형식(array),null 형식,class 형식,class 즉 대상 유형 을 설명 하 는 형식 을 포함 합 니 다.
그 중에서 도 가장 중요 한 유형 은 클 라 스 다.클래스 로 더 는 클래스 라 이브 러 리 를 찾 고 클래스 정 보 를 읽 으 며 클래스 라 이브 러 리 에 클래스 를 불 러 옵 니 다.이 불 러 오 는 행 위 는 필요 에 따라 불 러 오 는 것 입 니 다.즉,프로그램 이 사용 할 때 만 불 러 옵 니 다.같은 로 더 는 같은 종류의 한 번 만 불 러 옵 니 다.모든 자바 클래스 는 클래스 로 더 에 불 러 와 야 하 며,자바 프로그램 은 외부 라 이브 러 리 에 사용 할 수 있 습 니 다.JVM 이 시 작 될 때 세 가지 종류의 로 더 를 사용 합 니 다.Bootstrap 클래스 로 더,Extensions 클래스 로 더,System 클래스 로 더.
boottstrap 클래스 로 더/jre/lib 디 렉 터 리 의 자바 핵심 코드 입 니 다.이 종류의 로 더 는 JVM 핵심 중의 일부분 으로 JVM 에서 태 어 났 습 니 다.
확장 클래스 로 더 확장 디 렉 터 리 불 러 오기(JAVAHOME>/jre/lib/ext)에서 지정 한 코드 는 sun.misc.Launcher$ExtClassLoader 에서 실 현 됩 니 다.
System 클래스 로 더 는 java.class.path 의 코드 를 불 러 옵 니 다.즉,system CLASSPATH 변수 에 비 친 것 은 sun.misc.Launcher$AppClassLoaderclass 로 이 루어 집 니 다.
자바 에서 클 라 스 는 Final 을 명 시 했 기 때문에 계승 할 수 없다.그것 의 성명 은 다음 과 같다.
public final class Class extends Object
이러한 인 스 턴 스 는 자바 응용 프로그램 에서 실행 되 고 있 는 유형 을 나타 내 며 C\#의 Type 과 유사 합 니 다.이 종 류 는 정적 인 방법 이 있다.
static Class forName(String className)
className 이라는 클래스 나 인 터 페 이 스 를 되 돌려 줍 니 다.클래스 나 인터페이스의 이름 은 가방 의 이름 을 포함 하여 완전 해 야 합 니 다.이름 을 잘못 주면 이상 이 생 길 수 있다.
Class.forname 과 ClassLoader.loadclass()두 가지 방법 은 모두 클래스 이름 에 따라 자바 류 를 동적 으로 불 러 옵 니 다.그러나 이들 의 행동 의 차이 점 은 어떤 종류의 로 더(java.lang.ClassLoader)를 사용 하 는 지,클래스 대상 을 초기 화 하 는 지 여부 입 니 다.
Class.forName()의 가장 흔 한 형식 은 클래스 이름 의 문자열 을 매개 변수 로 입력 하 는 것 입 니 다.항상 호출 자의 classloader 를 사용 합 니 다.이 classloader 는 forName 코드 를 실행 하 는 클래스 로 더 를 불 러 옵 니 다.상대 적 인 ClassLoader.loadclass()는 인 스 턴 스 방법 입 니 다.classloader 를 지정 하 라 고 요구 합 니 다.이 classloader 는 현재 호출 코드 를 불 러 오 는 로 더 가 아 닐 수도 있 습 니 다.코드 에 클래스 를 불 러 올 때 지정 한 로 더 를 사용 해 야 한다 면 ClassLoader.loadclast()나 forName 에 세 개의 인자 가 있 는 리 셋 버 전 을 사용 해 야 합 니 다.
또한,Class.forName()의 일반적인 형식 은 불 러 올 클래스 를 초기 화 합 니 다.클래스 의 정적 초기 화 기 를 실행 하 는 데 직접 나타 납 니 다.이것 은 ClassLoader.loadclass()와 행동 이 다 릅 니 다.ClassLoader.loadclast()는 이 클래스 가 처음 사 용 될 때 만 초기 화 기 를 실행 합 니 다.초기 화 기,즉 클래스 의 static 부분 코드 입 니 다.
알 고 있 는 클래스 를 불 러 오 려 면 자원 을 많이 소모 하 는 정적 초기 화 기 를 선택 하 십시오.클래스 path 에 존재 하 는 클래스 를 불 러 오 는 것 을 선택 할 수 있 습 니 다.또한 초기 화 기 는 이러한 필드 나 방법 을 호출 할 때 만 실행 되 기 를 바 랍 니 다.그렇다면 방법 은 Class.forName(String,boolean,ClassLoader)이 가장 좋 은 선택 입 니 다.
두 번 째 매개 변 수 를 false 로 설정 하여 초기 화 기 를 지연 시 킬 수 있 습 니 다.세 번 째 매개 변 수 를 사용 하여 어떤 종류의 로 더 를 선택 할 지 지정 할 수 있 습 니 다.이 방법 이 가장 유연 하기 때문에 항상 이 방법 을 사용 하 는 것 을 추천 합 니 다.
클래스 를 성공 적 으로 불 러 오 는 것 은 문제 가 없 는 것 이 아 닙 니 다.정적 초기 화 기 에서 이상 을 던 지면 이 이상 은 자바.lang.Exception Initializer Error 에 감 싸 집 니 다.이 종 류 는 사용 할 수 없습니다.이렇게 해서 코드 에서 이러한 이상 오 류 를 처리 하려 면 Class.forName()방법 으로 초기 화 기 를 실행 해 야 합 니 다.

  
  
  
  
  1. public class Main  
  2. {  
  3.     public static void main (String [] args) throws Exception  
  4.     {  
  5.         for (int repeat = 0; repeat < 3; ++ repeat)  
  6.         {  
  7.             try 
  8.             {  
  9.                 // "Real" name for X is outer class name+$+nested class name:  
  10.                 Class.forName ("Main$X");  
  11.             }  
  12.             catch (Throwable t)  
  13.             {  
  14.                 System.out.println ("load attempt #" + repeat + ":");  
  15.                 t.printStackTrace (System.out);  
  16.             }  
  17.         }  
  18.     }  
  19.     private static class X  
  20.     {  
  21.         static 
  22.         {  
  23.             if (++ s_count == 1)  
  24.                 throw new RuntimeException ("failing static initializer...");  
  25.         }  
  26.     } // End of nested class  
  27.     private static int s_count;  
  28. // End of class  

이 코드 는 X 클래스 를 세 번 불 러 오 려 고 합 니 다.X 의 정적 초기 화 기 는 처음 실 행 될 때 만 실 패 했 지만,class.forName 을 호출 할 때마다 실 패 를 알 립 니 다.(이렇게 하면 클래스 의 정적 초기 화 구조 기 는 한 사람 만 운행 한 다 는 것 을 충분히 나타 낸다)
후속 불 러 오 는 데 실패 한 이상 은 java.lang.NoClassDefFoundeerror 입 니 다.JVM 이 X 가 전송 되 었 다 고 표 시 했 기 때 문 입 니 다(초기 화 기 를 실행 하기 전에).현재 클래스 로 더 가 쓰레기 로 회수 되 지 않 는 한 이 클래스 는 마 운 트 해제 되 지 않 습 니 다.그래서 다음 호출 은 Class.forName()입 니 다.JVM 은 초기 화 기 를 호출 하지 않 고 클래스 를 찾 지 못 한 것 으로 착각 합 니 다.NoClass Def Foundation Error 를 던 집 니 다.
자바 에 서 는 x.class 문법 을 사용 하여 이미 알 고 있 는 클래스 의 대상 을 얻 습 니 다.이 세부 사항 의 실현 은 컴 파일 러 에 따라 다 를 수 있 지만 모든 것 은 Class.forName()방법 을 사용 합 니 다.

좋은 웹페이지 즐겨찾기