자바 사용자 정의 클래스 로 더 를 어떻게 실현 합 니까?

12118 단어 필기 하 다.
클래스 로 더 는 클래스 로 더 를 불 러 오 는 단계 에서 주로 작 동 하 는 것 을 알 고 있 습 니 다.loadclass()방법 을 통 해 클 라 스 파일 바이트 코드 를 메모리 에 불 러 오고 정적 데 이 터 를 실행 할 때 데이터 영역 에 있 는 방법 영역 에 있 는 형식 데이터 로 변환 합 니 다.실행 할 때 데이터 영역 더미 에 이러한 종류의 자바.lang.class 대상 을 생 성 합 니 다.방법 영역 데이터 의 접근 입구 입 니 다.그렇다면 사용자 정의 클래스 로 더 를 실현 한다 면?사용자 정의 클래스 로 더 를 실현 합 니 다.다음 두 가지 핵심 함수 와 떨 어 질 수 없습니다.
Protected Class<?> findClass(String name) throws ClassNotFoundException{
    Throw new ClassNotFoundException(name);
}

이 함 수 는 클래스 파일 을 찾 는 데 사 용 됩 니 다.바 이 너 리 흐름 을 어떻게 읽 는 지,그리고 그것 을 처리 해서 클래스 대상 을 되 돌려 줍 니 다.
Protected final Class<?> defineClass(byte[] b,int off,int len) throws ClassFormatError{
    return defineClass(null,b,off,len,null);
}

클래스 를 정의 합 니 다.받 은 매개 변 수 는 by te[]바이트 코드 형식의 배열 형식 입 니 다.바이트 흐름 을 받 은 후에 우 리 는 그것 을 정의 한 다음 에 class 로 돌아 갈 수 있 습 니 다.인 스 턴 스 는 다음 과 같 습 니 다.주의:불 러 오기 전에 불 러 온 클래스 를 class 파일 로 컴 파일 해 야 합 니 다.불 러 오 는 클래스 정의
public class Paul{
    static {
        System.out.println(hello + "Paul");
    }
}

정의 클래스 로 더
public class MyClassLoader extends ClassLoader{
    private String path;
    private String classLoaderName;
    
    public MyClassLoader(String path, String classLoaderName){
        this.path = path;
        this.classLoaderName = classLoaderName;
    }
 
 /*
  *     
  */
@Override
public Class findClass(String name){
    byte[] b = loadClassData(name);
    //defineClass() final   ,      
    return defineClass(name, b, 0, b.length);
}

/*
 *     
 */
 private byte[] loadClassData(String name){
     name = path + name + ".class";
     
     inputStream in = null;
     //byte[]  
     ByteArrayOutputStream out = null;
     
     try{
         in = new FileInputStream(new File(name));
         out = new ByteArrayOutputStream();
         
         int i = 0;
         while((i = in.read()) != -1){
             out.write(i);
         }
     }catch(Exception e){
         e.printStackTrace();
     } finally{
         try{
             out.close();
             in.close();
         }catch(Exception e){
             e.printStackTrace();
         }
     }
 }
}

테스트 클래스
public class ClassLoaderChecker{
    public static void main(String[] args){
        MyClassLoader m new MyClassLoader("C:/Users/admin/Desktop/test/Paul/","myClassLoader");
        Class c = m.loadClass("Paul");
        
        System.out.println(c.getClassLoader());
        c.newInstance();
    }
}

본 블 로 그 는 순 휴대 전화 입력 에 속 합 니 다.오류 가 있 으 면 지적 을 환영 합 니 다.

좋은 웹페이지 즐겨찾기