다크호스 프로그래머 자바 첨단 기술 류 탑재 기 총화

6236 단어
안 드 로 이 드 교육, 자바 교육, 자바 학습 형 기술 블 로그, 당신 과 의 교 류 를 기대 합 니 다!
클래스 로 더 (classloader) 가 일반 프로그램 과 다른 것 은 자바 프로그램 (class 파일) 이 로 컬 실행 가능 한 프로그램 이 아 닙 니 다.자바 프로그램 을 실행 할 때 먼저 JVM (자바 가상 머 신) 을 실행 한 다음 자바 클 라 스 를 JVM 에 불 러 와 실행 합 니 다. 자바 클 라 스 를 불 러 오 는 이 부분 을 클 라 스 Loader 라 고 합 니 다.세 개의 주요 클래스 로 더 JVM 자체 에 하나의 ClassLoader 를 포함 하고 있 습 니 다. 이것 은 Bootstrap ClassLoader 라 고 합 니 다. JVM 과 마찬가지 로 Bootstrap ClassLoader 는 로 컬 코드 로 이 루어 진 것 입 니 다. 핵심 자바 Class (즉 모든 자바. * 로 시작 하 는 클래스) 를 불 러 오 는 것 을 책임 집 니 다. 또한 JVM 은 두 개의 ClassLoader 를 제공 합 니 다. 모두 자바 언어 로 작 성 된 것 으로 Bootstrap ClassLoader 로 불 러 옵 니 다.Extension ClassLoader 는 확 장 된 자바 클 라 스 (예 를 들 어 모든 자바 x. * 시작 클래스 와 JRE 의 ext 디 렉 터 리 에 저 장 된 클래스) 를 불 러 옵 니 다. applicationClassLoader 는 프로그램 자체 의 클래스 를 불 러 옵 니 다.
일반적으로 불 러 오 는 프로 세 스 는 프로그램 을 실행 할 때 JVM 이 시작 되 고 bootstrapclassloader 를 실행 하여 자바 핵심 API (ExtClassLoader 와 AppClassLoader 도 이때 불 러 옵 니 다) 를 불 러 옵 니 다. 그리고 ExtClassLoader 를 호출 하여 확장 API 를 불 러 옵 니 다. 마지막 으로 AppClassLoader 는 CLASSPATH 디 렉 터 리 에서 정의 하 는 Class 를 불 러 옵 니 다. 이것 이 프로그램의 가장 기본 적 인 불 러 오 는 프로 세 스 입 니 다.클래스 로 더 의 위탁 메커니즘 가로 의뢰: JVM 이 클래스 를 불 러 오 려 면 먼저 현재 스 레 드 의 클래스 로 더 를 보 내 스 레 드 의 첫 번 째 클래스 를 불 러 옵 니 다.클래스 A 에서 클래스 B 를 인용 하면 JVM 은 클래스 A 를 불 러 오 는 클래스 로 더 를 사용 하여 클래스 B 를 불 러 옵 니 다.수직 의뢰: 각 클래스 의 로 더 를 불 러 올 때 상위 클래스 의 로 더 를 먼저 의뢰 합 니 다.모든 부모 클래스 마 운 트 가 클래스 에 불 러 오지 않 았 을 때, 시작 클래스 마 운 트 로 돌아 가 아직 불 러 오지 않 으 면, ClassNotFoundException 을 버 리 고, 시작 클래스 마 운 트 의 하위 클래스 를 찾 지 않 습 니 다.다른 지식 점 JVM 은 실 행 될 때의 유효한 실행 문장 에 따라 새로운 종 류 를 불 러 올 지 여 부 를 결정 하여 가능 한 한 적은 종 류 를 불 러 올 지 여 부 를 결정 합 니 다.  클래스 로 더. loadclast () 방법 을 직접 호출 하여 클래스 로 더 를 불 러 올 수 있 습 니 다.배열 류 의 Class 대상 은 클래스 로 더 가 만 든 것 이 아니 라 자바 가 실 행 될 때 필요 에 따라 자동 으로 만 듭 니 다.배열 류 의 클래스 로 더 는 Class. getClassLoader () 에서 되 돌아 갑 니 다. 이 로 더 는 요소 형식의 클래스 로 더 와 같 습 니 다.이 요소 형식 이 기본 형식 이 라면 이 배열 류 는 클래스 로 더 가 없습니다. 모형 방법 디자인 모델 모형 방법 모델 은 추상 류 와 구체 적 인 서브 클래스 가 조 화 롭 게 완성 되 어야 한다. 추상 류 는 하나의 알고리즘 의 윤곽 과 구 조 를 제시 하고 구체 적 인 서브 클래스 는 이 알고리즘 의 각 논리 적 절 차 를 제시한다. 구체 적 인 서브 클래스 는 이 윤곽 과 구 조 를 채 우 고 서로 다른 서브 클래스 는 서로 다른 충전 방법 을 가진다.이런 기본 적 인 방법 을 모 으 는 방법 을 모델 링 방법 이 라 고 하 는데 이 모델 링 방법 은 추상 류 에서 구체 적 인 방법 으로 정의 한 것 이다.loadClass(String name); 지정 한 바 이 너 리 이름 으로 클래스 를 불 러 옵 니 다.이 방법의 기본 구현 은 다음 순서 로 클래스 를 검색 합 니 다.  1. findLoadedClass (String) 를 호출 하여 클래스 를 불 러 왔 는 지 확인 합 니 다.2. 부모 클래스 로 더 에서 loadclash 방법 을 호출 합 니 다.부모 클래스 로 더 가 null 이면 가상 컴퓨터 의 내장 클래스 로 더 를 사용 합 니 다.  3. findClass (String) 방법 으로 클래스 를 찾 습 니 다.findClass(String name); 지정 한 바 이 너 리 이름 으로 클래스 를 찾 습 니 다.이 방법 은 클래스 로 더 에 의 해 재 작성 되 어야 하 며, 의뢰 모델 에 따라 클래스 를 불 러 옵 니 다.부모 클래스 로 더 를 통 해 요청 한 클래스 를 검사 한 후, 이 방법 은 loadclass 방법 으로 호출 됩 니 다.defineClass(String name,byte[] b,int off,int len); byte 배열 을 Class 클래스 의 인 스 턴 스 로 변환 합 니 다.Class 를 분석 해 야 사용 할 수 있 습 니 다.사용자 정의 클래스 로 더 사용자 정의 클래스 로 더 를 작성 하려 면 ClassLoader 를 계승 해 야 합 니 다. loadClass 방법 을 다시 쓰 지 마 십시오. 그렇지 않 으 면 의뢰 체 제 를 파괴 하고 부모 클래스 로 더 가 성공 하지 못 하면 findClass 방법 을 호출 합 니 다. findClass 방법 을 다시 써 야 합 니 다. 사용자 정의 로 딩 경 로 를 지정 해 야 합 니 다. 예 를 들 어 Class 파일 이 암호 화 되 었 으 므 로 findClass 에서 복호화 하여 by te [] 로 변환 하고 by te [] 를 지정 해 야 합 니 다.defindClass 에 전달 하 는 방법.사용자 정의 클래스 로 더 프로 그래 밍 절차: 파일 내용 을 간단하게 암호 화 하 는 프로그램 을 만 듭 니 다.암호 화 된 클래스 를 불 러 오고 복호화 할 수 있 는 클래스 로 더 를 만 들 었 습 니 다.프로그램 호출 클래스 로 더 를 불 러 옵 니 다. 원본 프로그램 에 서 는 인용 변 수 를 정의 할 수 없습니다. 컴 파일 러 가 이 종 류 를 식별 할 수 없 기 때 문 입 니 다.프로그램 에 서 는 ClassLoader. load 방법 외 에 도 스 레 드 를 설정 한 컨 텍스트 클래스 로 더 나 시스템 클래스 로 더 를 사용 한 다음 Class. forName 을 사용 할 수 있 습 니 다.실험 절차: 패키지 이름 이 없 는 class 파일 을 암호 화하 고 암호 화 결 과 를 다른 디 렉 터 리 에 저장 합 니 다. 예 를 들 어 자바 MyClassLoader MyTest. class F:\itcast 에서 로 딩 프로그램 을 실행 하면 정상적으로 로 딩 될 수 있 습 니 다.그러나 인쇄 된 클래스 로 더 이름 은 AppClassLoader: 자바 MyClassLoader MyTest F:\itcast 는 CLASSPATH 환경 에서 클래스 파일 을 암호 화 된 클래스 파일 로 교체 하고 이전 작업 을 수행 하 는 데 문제 가 발생 했 습 니 다. AppClassLoader 클래스 로 더 를 불 러 오 는 데 실 패 했 습 니 다.CLASSPATH 환경 에서 클래스 파일 을 삭제 하고 이전 작업 을 수행 하 는 데 문제 가 없습니다.
//         
public class MyClassLoader extends ClassLoader{


	public static void main(String[] args) throws Exception {


		//            
		String srcPath = args[0];
		String destDir = args[1];
		FileInputStream fis = new FileInputStream(srcPath);
		String destFileName = srcPath.substring(srcPath.lastIndexOf('\\')+1);
		String destPath = destDir + "\\" + destFileName;
		FileOutputStream fos = new FileOutputStream(destPath);
		cypher(fis,fos);
		fis.close();
		fos.close();
	}
	
	//           
	private static void cypher(InputStream ips ,OutputStream ops) throws Exception{
		int b = -1;
		while((b=ips.read())!=-1){
			ops.write(b ^ 0xff);
		}
	}
	private String classDir;


	//  findClass  ,     Class         byte[],  defindClass   byte[]  Class  。
	protected Class> findClass(String name) throws ClassNotFoundException {
		
		String classFileName = classDir + "\\"  + name.substring(name.lastIndexOf('.')+1) + ".class";
		try {
			FileInputStream fis = new FileInputStream(classFileName);
			ByteArrayOutputStream  bos = new ByteArrayOutputStream();
			cypher(fis,bos);
			fis.close();
			System.out.println("aaa");
			byte[] bytes = bos.toByteArray();
			return defineClass(bytes, 0, bytes.length);
		} catch (Exception e) {
			
			e.printStackTrace();
		}
		return null;
	}	
	public MyClassLoader(){
		
	}
	public MyClassLoader(String classDir){
		this.classDir = classDir;
	}
}


//              
public class ClassLoaderTest {


	public static void main(String[] args) throws Exception {
		
		Class clazz = new MyClassLoader("itcastlib").loadClass("cn.itcast.day2.ClassLoaderAttachment");
		Date d1 =  (Date)clazz.newInstance();
		System.out.println(d1);
	}


}


//      Class 
public class ClassLoaderAttachment extends Date {
	public String toString(){
		return "hello,itcast";
	} 
}

자신의 클래스 로 더 이름과 현재 클래스 로 더 를 출력 할 수 있 는 부자 구조 관계 체인 을 만 드 는 MyServlet 을 만 듭 니 다. 정상적으로 발 표 된 후에 인쇄 결 과 는 WebAppClassloader 입 니 다.MyServlet. class 파일 을 jar 패키지 에 넣 고 ext 디 렉 터 리 에 넣 고 tomcat 를 다시 시작 하면 HttpServlet 의 오 류 를 찾 을 수 없습니다.servlet. jar 도 ext 디 렉 터 리 에 넣 었 습 니 다. 문제 가 해결 되 었 습 니 다. 인쇄 결 과 는 ExtclassLoader 입 니 다.부모 클래스 로 더 는 하위 클래스 로 더 만 불 러 올 수 있 는 클래스 를 참조 할 수 없습니다. 원 리 는 다음 과 같 습 니 다.
안 드 로 이 드 교육, 자바 교육, 자바 학습 형 기술 블 로그, 당신 과 의 교 류 를 기대 합 니 다!

좋은 웹페이지 즐겨찾기