자바 classloader 와 namespace 상세 소개

자바 classloader 와 namespace 상세 소개
  자바 가상 머 신 은 실행 중인 JAVA 프로그램 에서 사용 할 수 있 도록 JAVA 형식 을 불 러 오고 연결 하고 초기 화 합 니 다.이 중 로 딩 은 바 이 너 리 형식의 JAVA 타 입 을 JAVA 가상 머 신 에 읽 는 것 이다.연결 은 가상 컴퓨터 에 읽 힌 바 이 너 리 형식의 형식 데 이 터 를 가상 컴퓨터 가 실 행 될 때 상태 로 통합 하 는 것 이다.연결 단 계 는 세 단계-검증,준비 와 해석 으로 나 뉜 다.검증 은 JAVA 형식 데이터 형식 이 정확 하고 JAVA 가상 컴퓨터 에 적합 하도록 확보 했다.이 클래스 에 필요 한 메모 리 를 분배 할 준 비 를 하 십시오.예 를 들 어 클래스 변수 에 메모 리 를 분배 합 니 다.메모리 주소 포인터 와 같은 상수 탱크 의 기호 인용 을 직접 참조 로 변환 합 니 다.초기 화 기간 에 클래스 의 정적 변 수 를 활성화 하 는 초기 화 코드 와 정적 코드 블록 입 니 다.
  불 러 오 는 절차 의 최종 제품 은 불 러 오 는 클래스 클래스 의 인 스 턴 스 대상 으로 JAVA 프로그램 과 내부 데이터 구조 간 의 인터페이스 가 됩 니 다.불 러 오 는 모든 유형 에 대해 가상 컴퓨터 는 클 라 스 클래스 의 인 스 턴 스 를 만 듭 니 다.
1 류 적재 기의 안전 작용
  JAVA 류 적재 기 는 JAVA 안전 체계 구조 에서 가장 중요 한 역할 을 하 며 JAVA 안전 샌 드 박스 의 첫 번 째 방어선 이다.클래스 로 더 시스템 구 조 는 세 가지 측면 에서 JAVA 의 샌 드 박스 에 작용 합 니 다.
1)악성 코드 가 선의 의 코드 에 간섭 하 는 것 을 방지한다
2)신뢰 받 는 라 이브 러 리 의 경 계 를 지 켰 다.
3)코드 를 특정한 종류(보호 구역 이 라 고 함)에 포함 시 키 고 코드 가 어떤 조작 을 할 수 있 는 지 확인 합 니 다.
클래스 로 더 시스템 구 조 는 악성 코드 가 선의 의 코드 에 간섭 하 는 것 을 방지 할 수 있 습 니 다.이것 은 서로 다른 종류의 로 더 를 불 러 오 는 클래스 에 서로 다른 네 임 스페이스 를 제공 함으로써 이 루어 집 니 다.
2 부모 위임 모델
  JAVA 가상 머 신 은 두 가지 유형의 클래스 로 더-시작 클래스 로 더 와 사용자 정의 클래스 로 더 를 정의 합 니 다.시작 클래스 로 더 는 JAVA 가상 머 신 이 실현 하 는 일부분 입 니 다.ClassLoader 류 를 계승 하여 사용 자 는 사용자 정의 클래스 로 더 를 만들어 서 특정한 로 더 를 완성 할 수 있 습 니 다.JAVA 가상 머 신 은 사용자 정의 클래스 로 더-확장 클래스 로 더 와 시스템 클래스 로 더 를 만 들 었 습 니 다.
사용자 정의 클래스 로 더 는 만 들 때 부모 parent 클래스 로 더 를 할당 합 니 다.부모 클래스 로 더 를 사용자 정의 클래스 로 더 에 전달 하 는 구조 방법 이 표시 되 지 않 으 면 시스템 클래스 로 더 는 기본적으로 부모 로 지 정 됩 니 다.구조 방법 에 전 달 된 것 이 기 존 사용자 정의 클래스 로 더 의 참조 라면 사용자 정의 클래스 로 더 는 부모 가 됩 니 다.구조 적 방법 으로 null 을 전달 하면,작 동 클래스 로 더 는 부모 다.
시작 클래스 로 더 Bootstrap Classloader:JAVA 가상 컴퓨터 의 일부분 입 니 다.c/c++로 이 루어 졌 습 니 다.부모 가 없습니다.클래스 로 더 를 시작 하여 JAVA 핵심 라 이브 러 리 코드 를 불 러 옵 니 다.
확장 클래스 로 더 Extension Classloader:URLClassLoader 를 계승 하여 구조 적 방법 으로 null 을 초기 화 했 기 때문에 부 모 는 Bootstrap Classloaser 입 니 다.자바 ext.dirs 확장 디 렉 터 리 에서 코드 를 불 러 옵 니 다.
시스템 클래스 로 더 Application Classloader:URLClassLoader 를 계승 하고 부 모 는 Extension Classloaser 입 니 다.CLASSPATH 경로 에서 프로그램 코드 를 불 러 옵 니 다.
그 중에서 네트워크 클래스 로 더 URLClassLoader 는 JAVA 라 이브 러 리 에서 제공 하 는 클래스 로 더 로 네트워크 의 다른 위치 에서 클래스 를 불 러 옵 니 다.

부모 아이 류 적재 기 위임 체인
  부모 위임 모델 에서 로 더 가 어떤 종 류 를 불 러 오 라 고 요청 할 때 먼저 부모 parent 에 게 불 러 오 라 고 의뢰 합 니 다.parent 가 불 러 올 수 있다 면 해당 하 는 Class 대상 을 되 돌려 줍 니 다.parent 가 불 러 올 수 없다 면 parent 의 요청 자가 불 러 옵 니 다.
현재 Cindy 에 게 자바.io.FileReader 라 는 종 류 를 불 러 오 라 고 가정 합 니 다.신 디 의 첫 번 째 일 은 엄 마 를 찾 아가 그 타 입 을 싣 는 것 이다.엄마 가 하 는 첫 번 째 일 은 할머니 를 찾 아가 서 그 타 입 을 싣 는 것 이다.그 랜 드 마 는 우선 시동 류 로 더 를 찾 아가 서 불 러 옵 니 다.이 예 에서 클래스 로 더 를 시작 하면 그 종 류 를 불 러 올 수 있 습 니 다.자바.io.FileReader 를 대표 하 는 Class 인 스 턴 스 를 Grandma 에 게 되 돌려 줍 니 다.그 랜 드 마 는 해당 클래스 의 인용 맘 을 전 달 했 고,맘 마 는 신 디 에 게,신 디 는 프로그램 에 되 돌 렸 다.
 
  이 모델 에서 시작 클래스 로 더 는 확장 클래스 로 더 를 불 러 오기 전에 클래스 를 불 러 올 수 있 고,확장 클래스 로 더 는 시스템 클래스 로 더 를 불 러 오기 전에 클래스 를 불 러 올 수 있 으 며,시스템 클래스 로 더 는 네트워크 클래스 로 더 를 불 러 오기 전에 불 러 올 수 있 습 니 다.이렇게 부모-아이 위임 체인 방식 을 사용 하여 클래스 로 더 를 시작 하면 가장 신뢰 할 수 있 는 라 이브 러 리-핵심 자바 API-에서 불 러 온 모든 유형 을 먼저 검사 한 다음 에 확장 경로,시스템 클래스 경로 에서 불 러 온 형식 파일 을 순서대로 검사 합 니 다.이런 방법 으로 클래스 로 더 의 시스템 구 조 는 신뢰 할 수 있 는 클래스 를 자신의 버 전 으로 대체 하 는 것 을 방지 할 수 있다.
3 네 임 스페이스 
서로 다른 클래스 로 더 에 불 러 오 는 클래스 는 가상 컴퓨터 내부 의 서로 다른 네 임 스페이스 에 놓 입 니 다.네 임 스페이스 는 일련의 유일한 이름 으로 구성 되 어 있 으 며,불 러 오 는 클래스 마다 이름 이 있 습 니 다.JAVA 가상 머 신 은 모든 종류의 로 더 를 위해 이름 공간 을 유지 합 니 다.예 를 들 어 JAVA 가상 컴퓨터 가 Volcano 라 는 종 류 를 특정한 네 임 스페이스 에 불 러 오 면 Valcano 라 는 다른 종 류 를 같은 네 임 스페이스 로 불 러 올 수 없습니다.여러 개의 Valcano 클래스 를 하나의 JAVA 가상 컴퓨터 에 불 러 올 수 있 습 니 다.여러 개의 클래스 로 더 를 만들어 서 하나의 JAVA 프로그램 에 여러 개의 네 임 스페이스 를 만 들 수 있 기 때 문 입 니 다.
1)  초기 클래스 로 더/정의 클래스 로 더
네 임 스페이스 는 안전 한 실현 에 도움 이 된다.왜냐하면 서로 다른 네 임 스페이스 를 불 러 온 클래스 사이 에 보호 막 을 효과적으로 설치 할 수 있 기 때문이다.JAVA 가상 머 신 에 서 는 같은 네 임 스페이스 에 있 는 클래스 가 직접 상호작용 을 할 수 있 지만 서로 다른 네 임 스페이스 에 있 는 클래스 는 서로의 존 재 를 감지 하지 못 한다.클래스 대상 의 인용 을 받 은 후에 반 사 를 사용 하여 접근 하 는 등 상호작용 을 허용 하 는 체 제 를 표시 하지 않 는 한.
  어떤 종류의 로 더 에 게 종 류 를 불 러 오 라 고 요구 하면 다른 종류의 로 더 에 불 러 오 는 종 류 를 되 돌려 줍 니 다.이 로 더 는 그 유형의 초기 로 더 라 고 합 니 다.실제 불 러 오 는 클래스 로 더 는 이 유형의 정의 클래스 로 더 라 고 합 니 다.불 러 오 라 는 형식 이 있 으 며,Class 인 스 턴 스 를 되 돌려 줄 수 있 는 클래스 로 더 는 이 유형의 초기 클래스 로 더 입 니 다.위의 예 에서 자바.io.FileReader 정의 클래스 로 더 는 시작 클래스 로 더 이 고 Cindy,Mom,Grandma,시작 클래스 로 더 는 모두 초기 클래스 로 더 입 니 다.
  가상 기 회 는 모든 종류의 로 더 에 목록 을 유지 합 니 다.목록 에는 요청 한 형식의 이름 이 있 습 니 다.이 목록 들 은 모든 종류의 로 더 가 초기 클래스 로 표 시 된 형식 을 포함 하고 있 으 며,모든 종류의 로 더 의 네 임 스페이스 를 대표 합 니 다.가상 머 신 은 항상 loadclast()를 호출 하기 전에 이 내부 목록 을 검사 합 니 다.이 종류의 로 더 가 이 모든 제한 이름 을 가 진 최초의 로 더 로 표시 되 어 있 으 면 이 유형의 Class 인 스 턴 스 를 되 돌려 줍 니 다.그러면 가상 머 신 은 같은 사용자 정의 로 더 에서 같은 이름 의 종 류 를 두 번 자동 으로 호출 하지 않 습 니 다.
2)네 임 스페이스 의 유형 공유
  앞에서 언급 한 바 와 같이 같은 네 임 스페이스 의 클래스 만 이 직접 상호작용 을 할 수 있 습 니 다.그러나 저 희 는 사용자 정의 클래스 로 더 가 정의 하 는 유형 에서 자바 API 류 를 직접 사용 합 니 다.이것 은 모순 이 아 닙 니까?이것 은 유형 공유 의 원인 입 니 다.만약 에 특정한 종류의 로 더 가 불 러 온 작업 을 다른 종류의 로 더 에 위임 하고 후 자 는 이 유형 을 정의 하면 위 임 된 클래스 로 더 가 불 러 온 이 유형 은 이 유형의 초기 로 더 로 표 시 된 모든 이름 공간 에서 공 유 됩 니 다.
예 를 들 어 위의 예 에서 신 디 는 몬·그 랜 드 마·시동 클래스 로 더 의 네 임 스페이스 에 있 는 유형 을 공유 할 수 있 고,케 니 는 몬·그 랜 드 마·시동 클래스 로 더 의 네 임 스페이스 에 있 는 유형 도 공유 할 수 있 지만,신 디 와 케 니 의 네 임 스페이스 는 공유 할 수 없다.
3)런 타임 팩
  모든 종류의 로 더 는 자신의 네 임 스페이스 를 가지 고 있 으 며,그 중에서 불 러 오 는 종 류 를 유지 하고 있 습 니 다.그래서 하나의 JAVA 프로그램 은 같은 제한 이름 을 가 진 여러 종 류 를 여러 번 불 러 올 수 있 습 니 다.이러한 유형의 전체 제한 이름 은 JAVA 가상 컴퓨터 에서 의 유일 성 을 확정 하기 에는 부족 하 다.따라서 여러 종류의 로 더 가 같은 이름 의 종 류 를 불 러 왔 을 때 이 종 류 를 유일 하 게 표시 하기 위해 서 는 유형 이름 앞 에 이 종류의 로 더 를 불 러 와 서-[classloader class]를 표시 해 야 합 니 다.
  두 가지 유형 간 에 가방 에 보 이 는 구성원 을 방문 할 수 있 도록 하기 전에 가상 컴퓨터 는 이 두 가지 유형 이 같은 가방 에 속 하 는 지 확인 해 야 할 뿐만 아니 라 같은 런 타임 패키지 에 속 하 는 지 확인 해 야 합 니 다.같은 종류의 로 더 가 불 러 와 야 합 니 다.이렇게 하면 자바.lang.Virus 와 핵심 자바.lang 의 클래스 는 같은 런 타임 패키지 에 속 하지 않 습 니 다.자바.lang.Virus 는 자바 API 의 자바.lang 패키지 에 있 는 가방 에 보 이 는 구성원 에 게 접근 할 수 없습니다.
4 사용자 정의 클래스 로 더
  JAVA 형식 은 시작 클래스 로 더 를 불 러 오 거나 사용자 정의 클래스 로 더 를 통 해 불 러 옵 니 다.클래스 로 더 를 시작 하 는 것 은 가상 컴퓨터 가 구현 하 는 일부분 입 니 다.구현 과 무관 한 방식 으로 종 류 를 불 러 옵 니 다.JAVA 는 추상 적 인 클래스 java.lang.ClassLoader 를 제공 합 니 다.사용자 정의 클래스 로 더 는 클래스 ClassLoader 의 하위 클래스 인 스 턴 스 로 맞 춤 형 으로 종 류 를 불 러 옵 니 다.모든 사용자 정의 클래스 로 더 는 ClassLoader 의 하위 클래스 를 예화 합 니 다.
간단 한 사용자 정의 클래스 로 더 를 제공 합 니 다.

import java.io.*; 
public class UserDefinedClassLoader extends ClassLoader 
{ 
 private String directory = "d:/classes/"; 
 private String extensionType = ".class"; 
  
 public UserDefinedClassLoader() 
 { 
  super(); // this set the parent as the AppClassLoader by default 
 } 
  
 public UserDefinedClassLoader( ClassLoader parent ) 
 { 
  super( parent ); 
 } 
  
 public Class findClass( String name ) 
 { 
  byte[] data = loadClassData( name ); 
   
  return defineClass( name, data, 0, data.length ); 
 } 
  
 private byte[] loadClassData( String name ) 
 { 
  byte[] data = null; 
  try 
  { 
   FileInputStream in = new FileInputStream( new File( directory + name.replace( '.', '/') + extensionType ) ); 
   ByteArrayOutputStream out = new ByteArrayOutputStream(); 
   int ch = 0; 
    
   while( ( ch = in.read() ) != -1 ) 
   { 
    out.write( ch ); 
   } 
    
   data = out.toByteArray(); 
  } 
  catch ( IOException e ) 
  { 
   e.printStackTrace(); 
  } 
  return data; 
 } 
} 
 

public class Valcano 
{ 
 static 
 { 
  System.out.println("Valcano Class Initialized");  
 } 
  
 public Valcano() 
 { 
 } 
} 
public class ClassLoaderTest 
{ 
 public static void main( String[] args ) 
 { 
  try 
  { 
   UserDefinedClassLoader userLoader = new UserDefinedClassLoader(); 
   Class valcanoClass1 = userLoader.loadClass( "Valcano" ); 
    
   URL url = new URL("file:/d:/classes/" ); 
   ClassLoader urlLoader = new URLClassLoader( new URL[] { url } ); 
   Class valcanoClass2 = urlLoader.loadClass( "Valcano" ); 
   System.out.println( "valcanoClass1 classloaer = " + valcanoClass1.getClassLoader() ); 
   System.out.println( "valcanoClass2 classloaer = " + valcanoClass2.getClassLoader() ); 
    
   System.out.println( "valcanoClass1 = valcanoClass2 ? " + ( valcanoClass1 == valcanoClass2 ) ); 
  } 
  catch( Exception e ) 
  { 
   e.printStackTrace(); 
  } 
 } 
} 
출력 결과:

valcanoClass1 classloaer = UserDefinedClassLoader@1fb8ee3
valcanoClass2 classloaer = java.NET.URLClassLoader@14318bb
valcanoClass1 = valcanoClass2 ? false
서로 다른 Valcano 의 Class 인 스 턴 스 가 같은 가상 컴퓨터 에 불 러 오 는 것 을 볼 수 있 습 니 다.
또한 Valcano 클래스 의 정적 초기 화 문 이 실행 되 지 않 은 것 을 보 았 습 니 다.클래스 가 초기 화 되 지 않 았 음 을 의미 합 니 다.이것 은 JAVA 에서 클래스 가 주동 적 으로 사 용 될 때 만 형식 이 초기 화 되 기 때 문 입 니 다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기