자바 의 클래스 로 더
6874 단어 로 더
자바 의 형식 시스템 은 4 가지 유형,원본 형식(primitive),배열 형식(array),null 형식,class 형식,class 즉 대상 유형 을 설명 하 는 형식 을 포함 합 니 다.
그 중에서 도 가장 중요 한 유형 은 클 라 스 다.클래스 로 더 는 클래스 라 이브 러 리 를 찾 고 클래스 정 보 를 읽 으 며 클래스 라 이브 러 리 에 클래스 를 불 러 옵 니 다.이 불 러 오 는 행 위 는 필요 에 따라 불 러 오 는 것 입 니 다.즉,프로그램 이 사용 할 때 만 불 러 옵 니 다.같은 로 더 는 같은 종류의 한 번 만 불 러 옵 니 다.모든 자바 클래스 는 클래스 로 더 에 불 러 와 야 하 며,자바 프로그램 은 외부 라 이브 러 리 에 사용 할 수 있 습 니 다.JVM 이 시 작 될 때 세 가지 종류의 로 더 를 사용 합 니 다.Bootstrap 클래스 로 더,Extensions 클래스 로 더,System 클래스 로 더.
boottstrap 클래스 로 더
확장 클래스 로 더 확장 디 렉 터 리 불 러 오기(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()방법 으로 초기 화 기 를 실행 해 야 합 니 다.
- public class Main
- {
- public static void main (String [] args) throws Exception
- {
- for (int repeat = 0; repeat < 3; ++ repeat)
- {
- try
- {
- // "Real" name for X is outer class name+$+nested class name:
- Class.forName ("Main$X");
- }
- catch (Throwable t)
- {
- System.out.println ("load attempt #" + repeat + ":");
- t.printStackTrace (System.out);
- }
- }
- }
- private static class X
- {
- static
- {
- if (++ s_count == 1)
- throw new RuntimeException ("failing static initializer...");
- }
- } // End of nested class
- private static int s_count;
- } // End of class
이 코드 는 X 클래스 를 세 번 불 러 오 려 고 합 니 다.X 의 정적 초기 화 기 는 처음 실 행 될 때 만 실 패 했 지만,class.forName 을 호출 할 때마다 실 패 를 알 립 니 다.(이렇게 하면 클래스 의 정적 초기 화 구조 기 는 한 사람 만 운행 한 다 는 것 을 충분히 나타 낸다)
후속 불 러 오 는 데 실패 한 이상 은 java.lang.NoClassDefFoundeerror 입 니 다.JVM 이 X 가 전송 되 었 다 고 표 시 했 기 때 문 입 니 다(초기 화 기 를 실행 하기 전에).현재 클래스 로 더 가 쓰레기 로 회수 되 지 않 는 한 이 클래스 는 마 운 트 해제 되 지 않 습 니 다.그래서 다음 호출 은 Class.forName()입 니 다.JVM 은 초기 화 기 를 호출 하지 않 고 클래스 를 찾 지 못 한 것 으로 착각 합 니 다.NoClass Def Foundation Error 를 던 집 니 다.
자바 에 서 는 x.class 문법 을 사용 하여 이미 알 고 있 는 클래스 의 대상 을 얻 습 니 다.이 세부 사항 의 실현 은 컴 파일 러 에 따라 다 를 수 있 지만 모든 것 은 Class.forName()방법 을 사용 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 사용자 정의 클래스 로 더 기반 열 배치 프로 세 스 분석열 배 치 는 응용 프로그램 을 다시 시작 하지 않 은 상태 에서 클래스 의 정의 인 바이트 코드 파일 이 수정 되면 이 Class 가 만 든 대상 을 교체 할 수 있 습 니 다.일반적으로 클래스 의 로 딩 은 시스...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.