클래스 로 더, 부모 의뢰 모델, 네 임 스페이스, 안전성

기본 개념
 
    클래스 로 더 는 클래스 클 라 스 를 JVM 에 불 러 오 는 데 사 용 됩 니 다.
 
자바 가 실 행 될 때 세 개의 ClassLoader 가 생 성 됩 니 다.
 
Bootstrap ClassLoader (C + + 작성)            자바. lang. * 등 핵심 라 이브 러 리 를 불 러 오 는 데 사용 합 니 다.

ExtClassLoader                         ext 디 렉 터 리 나 ext. dir 가 지정 한 디 렉 터 리 의 라 이브 러 리 를 불 러 옵 니 다.

AppClassLoader                        CLASSPATH 의 라 이브 러 리 및 클래스 를 불 러 오 는 데 사용 합 니 다.
 
    이 가운데 ExtClassLoader 와 AppClassLoader 도 Bootstrap ClassLoader 에서 불 러 왔 다.우리 도 ClassLoader 를 계승 하여 자신의 ClassLoader 를 실현 할 수 있다.
 
 
부모 의뢰 모델
 
    JAVA 플랫폼 의 안전 을 더욱 잘 보장 합 니 다.이 모델 에서 로 더 가 클래스 를 불 러 오 라 는 요청 을 받 았 을 때, 먼저 자신의 parent 에 불 러 오 라 고 의뢰 합 니 다. parent 가 불 러 올 수 있다 면, 이 클래스 에 대응 하 는 Class 대상 을 되 돌려 줍 니 다. 그렇지 않 으 면 부모 클래스 의 부모 클래스 에 불 러 옵 니 다.
 
    이 모델 에서 사용자 정의 클래스 로 더 는 아버지 가 불 러 와 야 할 신뢰 할 수 있 는 클래스 를 불 러 올 수 없 으 며, 아버지 가 불 러 와 야 할 신뢰 할 수 있 는 코드 대신 신뢰 할 수 없 거나 악의 적 인 코드 를 불 러 올 수 없습니다.
 
 
3. 네 임 스페이스
 
    우리 가 다음 과 같은 구조 가 있다 고 가정 하면:
                       Loader 1 (클래스 1 장 착)
                                        ↑
Loader 2 (클래스 2 장 착)
                         ↑                        ↑
Loader 3 (클래스 3 장 착)             Loader 4 (클래스 4 장 착)
그 중에서 Loader 1 은 실제 Class 1 을 실 었 고 Loader 는 실제 Class 2 를 실 었 으 며 나머지 는 유사 하 다.
 
여기 서 우 리 는 두 가지 개념 을 명 확 히 한다.
    정의 클래스 로 더: 실제 로 더 클래스 로 더.예 를 들 어 위의 Class 1 의 정의 클래스 로 더 는 Loader 1 입 니 다.Class 3 의 정의 클래스 로 더 는 Loader 3 입 니 다.
    초기 클래스 로 더: 어떤 종 류 를 불 러 오 라 고 요구 되 고 이 유형의 Class 클래스 로 더 를 되 돌려 줄 수 있 는 모든 종류의 초기 클래스 로 더 라 고 합 니 다.예 를 들 어, Class 1 의 초기 로 더 는 Loader 3, Loader 4, Loader 2, Loader 1 이 있 습 니 다.  따라서 정의 클래스 로 더 에서 내 려 오 는 모든 하위 로 더 는 이 유형의 초기 로 더 입 니 다. 정의 클래스 로 더 를 포함 합 니 다.
 
   모든 ClassLoader 는 자신의 네 임 스페이스 를 가지 고 있 습 니 다. 네 임 스페이스 는 이 로 더 를 초기 클래스 로 하 는 모든 클래스 로 구성 되 어 있 습 니 다. 다음 표 참조:
클래스 로 더
네 임 스페이스
Loader1
Class1
Loader2
Class1 Class2
Loader3
Class1 Class2 Class3
Loader4
Class1 Class2 Class4
 
        ClassLoader 는 loadClass 를 호출 하기 전에 현재 네 임 스페이스 (내부 목록) 를 먼저 검사 합 니 다. ClassLoader 가 이 유형의 초기 클래스 로 더 라면 이 유형의 Class 인 스 턴 스 를 되 돌려 줍 니 다.이렇게 하면 가상 컴퓨터 는 같은 ClassLoader 에 같은 유형 을 두 번 불 러 오지 않 습 니 다.
 
        서로 다른 네 임 스페이스 의 두 가지 종 류 는 보이 지 않 습 니 다 (예 를 들 어 상례 의 Class 3 과 Class 4). 그러나 클래스 에 대응 하 는 Class 대상 의 reference 를 얻 으 면 다른 네 임 스페이스 에 접근 할 수 있 습 니 다.
 
 
 
런 타임 패키지
 
    같은 ClassLoader 에서 같은 가방 에 속 하 는 클래스 를 정의 하여 실행 중인 가방 을 구성 합 니 다. 두 가지 클래스 가 같은 실행 중인 가방 에 속 하 는 지 아 닌 지 를 결정 합 니 다. 가방 이름 이 같은 지 뿐만 아니 라 같은 ClassLoader 에서 불 러 온 것 인지 확인 해 야 합 니 다.같은 런 타임 패키지 에 속 하 는 클래스 만 가방 에 보 이 는 클래스 와 구성원 을 서로 방문 할 수 있 습 니 다.
 
      이러한 제한 은 사용자 자신의 코드 가 핵심 라 이브 러 리 를 사칭 하 는 클래스 가 핵심 라 이브 러 리 패키지 에 접근 하여 구성원 을 볼 수 있 는 상황 을 피 할 수 있다.사용자 가 자바. lang. xxx 를 정의 하고 사용자 정의 ClassLoader 로 불 러 옵 니 다. 자바. lang. * 와 자바. lang. xxx 는 서로 다른 로 더 에 의 해 불 러 옵 니 다. 서로 다른 런 타임 패키지 에 속 하기 때문에 자바. lang. xxx 는 핵심 라 이브 러 리 자바. lang 에 접근 할 수 없습니다.
 
다시 말 하면 네 임 스페이스 격 리 는 서로 다른 공간 에 속 하 는 클래스 의 상호 방문 을 완전히 금지 하 는 것 이 아니 라 부모 의 의뢰 로 자바 의 안전 을 강화 하고 운행 할 때 가방 이 보 이 는 구성원 에 대한 보 호 를 증가 시 켰 다.
 
5. 자신의 ClassLoader 실현
 
우 리 는 또한 자신의 ClassLoader 를 실현 할 수 있 으 며, ClassLoader 류 를 계승 하여 findClass 방법 을 다시 쓸 수 있다.예:
 
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class MyClassLoader extends ClassLoader {   
  
    public Class findClass(String name) {   
        byte[] data = loadClassData(name);   
        return defineClass(name, data, 0, data.length);   
    }   
  
    public byte[] loadClassData(String name) {   
        FileInputStream fis = null;   
        byte[] data = null;   
        try {   
            fis = new FileInputStream(new File("E:/home/" + name.replace(".", "/") + ".class"));   
            ByteArrayOutputStream out = new ByteArrayOutputStream();   
            int ch = 0;   
            while ((ch = fis.read()) != -1) {   
                out.write(ch);   
            }   
            data = out.toByteArray();   
        } catch (IOException e) {   
            e.printStackTrace();   
        }   
        return data;   
    }   
}  

좋은 웹페이지 즐겨찾기