java기초-클래스 캐리어: 클래스 캐리어 구현

2620 단어
    1, class ?
     MD5 
    2, :
     :Bootstrap Classloader>  jre/lib/rt.jar   : Object,String 
     :ExtClassLoader> jre/lib/ext/*  jar  JAVA_HOME/jre/lib/ext  jar 

클래스 로더: AppClassLoader >classpath 경로에 있는jar와 디렉터리에 자신이 쓴 클래스를 불러옵니다.
       :
            class

loadclass 방법: 양친이 의뢰하는 방식으로 클래스findclass를 불러오는 방법: 클래스의 패키지 경로에 따라class 파일 defineclass: 바이트 코드에서class 대상을 불러오고 클래스 대상은 반사 메커니즘을 통해 대상을 생성합니다.findclass 횟수<=loadclass 횟수는 어떻게 클래스 캐리어를 실현합니까?양친위 모델을 파괴해서 다시 쓰는 방법은 없습니다:findclass ()//다른 두 개는 다시 쓸 수 없습니다.loadclass를 다시 쓰면 양친 위임 모델을 파괴할 수 있습니다.defineclass는 패키지 권한만 있고 원본 호출만 가능합니다.
import java.io.*;

/**
* @Created with IntelliJ IDEA
* @Description:
* @Package: PACKAGE_NAME
* @User: FLy
* @Date: 2018/11/21
* @Time: 10:20
*/
class MyClassLoader extends ClassLoader{

    @Override
    protected Class> findClass(String name) throws ClassNotFoundException {
        //TODO Auto-generated method stub
        String Dir="D:";// 
        String classPath=Dir+File.separatorChar+name.replace('.',File.separatorChar)+".class";
        File file= new File(classPath);
        byte[] buff=null;
        InputStream in;
        try{
            in=new FileInputStream(file);
            buff=new byte[in.available()];
            in.read(buff);
            in.close();
            Class> c=defineClass(name,buff,0,buff.length);
            return c;
        }catch (FileNotFoundException e){
            //TODO Auto-generated catch block
            e.printStackTrace();
        }catch(IOException e) {
            //TODO Auto-generted catch block
            e.printStackTrace();
        }
        return super.findClass(classPath);
    }
}

양친위 파견 모델의 장점: 1.안전성: 사용자가 직접 작성한 클래스가 자바의 일부 핵심 클래스를 동적 교체하는 것을 피합니다.만약 양친위 파견 모델의 불러오는 방식으로 클래스의 불러오는 작업을 하지 않는다면, 우리는 자바 핵심 API에서 정의한 클래스를 마음대로 사용하여 동적으로 대체할 수 있다.양친위 파견 모델의 이런 불러오는 방식은 이런 상황을 피할 수 있다. 왜냐하면 String 클래스는 시작할 때 부팅 클래스 불러오는 장치에 의해 불러오기 때문이다.2. 클래스의 중복 불러오는 것을 피한다.JVM은 두 클래스가 같은 클래스인지 여부를 판정하기 때문에 클래스 이름이 같은지에 따라 판정할 뿐만 아니라 이 클래스를 불러오는 캐리어가 같은 캐리어인지 판단해야 한다.같은class 파일이 다른 클래스 캐리어에 불러온 결과는 다른 클래스입니다.3. JAVA 클래스는 클래스 로더와 함께 우선순위가 있는 차원 관계를 가진다.예: Javalang.Object.이것은 rt.jar에 존재합니다. 어떤 클래스 마운트가 이 클래스를 불러오든지 최종적으로 모델 맨 위에 있는 Bootstrap ClassLoader에 위임하여 불러옵니다. 따라서 Object 클래스는 프로그램의 각종 클래스 마운트 환경에서 같은 클래스입니다.반대로 양친위 파견 모델이 없고 각 종류의 캐리어가 자체적으로 불러오면 사용자가java를 작성합니다.lang.Object의 동명 클래스를classPath에 놓으면 시스템에 여러 개의 다른 Object 클래스가 나타나고 프로그램이 혼란스러워집니다.그래서만약 개발자가 rt.jar 라이브러리와 이름이 바뀐 자바 클래스를 작성하려고 시도한다면, 정상적으로 컴파일할 수 있지만, 불러올 수 없습니다.

좋은 웹페이지 즐겨찾기