자바 클래스 프로세서 2 깊이 연구

자신의 클래스 로 더 를 개발 하 다.
  오 마 이 갓,이 작가 사랑 해 죽 겠 어!!눈물 을 흘리다
대부분의 경우 시스템 이 기본적으로 제공 하 는 클래스 로 더 는 수 요 를 만족 시 킬 수 있 습 니 다.그러나 어떤 경우 에는 응용 을 위해 자신의 클래스 로 더 를 개발 해 야 합 니 다.예 를 들 어 네트워크 를 통 해 자바 류 의 바이트 코드 를 전송 하고 안전성 을 확보 하기 위해 이 바이트 코드 들 은 암호 화 처 리 를 거 쳤 습 니 다.이 럴 때 암호 화 된 바이트 코드 를 네트워크 주소 에서 읽 고 복호화 와 검증 을 한 다음 자바 가상 컴퓨터 에서 실행 할 클래스 를 정의 해 야 합 니 다.다음은 두 개의 구체 적 인 실례 를 통 해 클래스 캐리어 의 개발 을 설명 할 것 이다.
파일 시스템 클래스 로 더
첫 번 째 클래스 로 더 는 파일 시스템 에 저 장 된 자바 바이트 코드 를 불 러 오 는 데 사 용 됩 니 다.온전 하 다  코드 목록 6  보 여 주 는 바.
목록 6.파일 시스템 클래스 로 더
public class FileSystemClassLoader extends ClassLoader { private String rootDir; public FileSystemClassLoader(String rootDir) { this.rootDir = rootDir; }  //  ClassLoader     protected Class<?> findClass(String name) throws ClassNotFoundException { byte[] classData = getClassData(name); if (classData == null) { throw new ClassNotFoundException(); } else { return defineClass(name, classData, 0, classData.length); //  Class } } private byte[] getClassData(String className) { 
  //         String path = classNameToPath(className); try { InputStream ins = new FileInputStream(path); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int bufferSize = 4096; byte[] buffer = new byte[bufferSize]; int bytesNumRead = 0; while ((bytesNumRead = ins.read(buffer)) != -1) { baos.write(buffer, 0, bytesNumRead); //             StringBuff  } return baos.toByteArray(); //       } catch (IOException e) { e.printStackTrace(); } return null; } private String classNameToPath(String className) { return rootDir + File.separatorChar + className.replace('.', File.separatorChar) + ".class"; } }

...와 같다  코드 목록 6  보다  FileSystemClassLoader  상속  java.lang.ClassLoader 。...에 있다  표 1  열거했어  java.lang.ClassLoader  클래스 의 상용 방법 중,일반적으로 자신 이 개발 한 클래스 로 더 는 복사 만 필요 하 다.  findClass(String name)  방법 이면 됩 니 다.java.lang.ClassLoader  유형 적 방법  loadClass()  앞에서 언급 한 대리 모델 의 실현 을 봉인 하 였 다.이 방법 은 우선 호출 될 것 이다.  findLoadedClass()  이 클래스 가 불 러 왔 는 지 확인 하 는 방법;불 러 오지 않 았 다 면 부모 클래스 로 더 를 호출 할 것 입 니 다.  loadClass()  이 종 류 를 불 러 오 는 방법;부모 클래스 로 더 가 이 종 류 를 불 러 올 수 없다 면 호출 하 십시오.  findClass()  방법 은 이 종 류 를 찾 습 니 다.따라서 클래스 로 더 가 프 록 시 모드 를 정확하게 실현 할 수 있 도록 자신의 클래스 로 더 를 개발 할 때 덮어 쓰 지 않 는 것 이 좋 습 니 다.  loadClass()  방법  findClass()  방법
종류  FileSystemClassLoader  의  findClass()  방법 은 우선 클래스 의 전체 이름 에 따라 하 드 디스크 에서 클래스 의 바이트 코드 파일(class 파일)을 찾 은 다음 이 파일 의 내용 을 읽 고 마지막 으로 통과 합 니 다.  defineClass()  방법 은 이 바이트 코드 를  java.lang.Class  클래스 의 실례.
네트워크 클래스 로 더
   다음은 네트워크 클래스 로 더 를 통 해 클래스 로 더 를 통 해 구성 요소 의 동적 업 데 이 트 를 어떻게 실현 하 는 지 설명 할 것 입 니 다.즉,기본 적 인 장면 은 자바 바이트 코드(class)파일 이 서버 에 저장 되 고 클 라 이언 트 가 네트워크 를 통 해 바이트 코드 를 가 져 와 실행 하 는 것 이다.버 전이 업데이트 되 었 을 때 서버 에 저 장 된 파일 만 교체 하면 됩 니 다.클래스 로 더 를 통 해 이런 수 요 를 비교적 간단하게 실현 할 수 있다.
종류  NetworkClassLoader  인터넷 을 통 해 자바 류 바이트 코드 를 다운로드 하고 자바 류 를 정의 합 니 다.그것 의 실현 과  FileSystemClassLoader  유사 하 다.통과  NetworkClassLoader  어떤 버 전의 종 류 를 불 러 온 후에 보통 두 가지 방법 으로 사용 합 니 다.첫 번 째 방법 은 자바 반사 API 를 사용 하 는 것 이다.또 다른 방법 은 인 터 페 이 스 를 사용 하 는 것 이다.주의해 야 할 것 은 클 라 이언 트 코드 에서 서버 에서 다운로드 한 종 류 를 직접 참조 할 수 없습니다.클 라 이언 트 코드 의 클래스 로 더 는 이러한 종 류 를 찾 을 수 없 기 때 문 입 니 다.자바 반사 API 를 사용 하면 자바 류 를 직접 호출 할 수 있 는 방법 입 니 다.인 터 페 이 스 를 사용 하 는 방법 은 인터페이스의 종 류 를 클 라 이언 트 에 두 고 서버 에서 이 인 터 페 이 스 를 실현 하 는 서로 다른 버 전의 종 류 를 불 러 오 는 것 이다.클 라 이언 트 에서 같은 인 터 페 이 스 를 통 해 이러한 실현 클래스 를 사용 합 니 다.네트워크 클래스 로 더 의 구체 적 인 코드 참조  다운로드 하 다.
자신의 클래스 로 더 를 어떻게 개발 하 는 지 소개 한 후,클래스 로 더 와 웹 용기 의 관 계 를 설명 합 니 다.
페이지 맨 위
클래스 프로세서 와 웹 용기
자바 EE 에서 실행 하기™ 용기 에 있 는 웹 응용 에 있어 서 클래스 로 더 의 실현 방식 은 일반적인 자바 응용 과 다르다.웹 용기 마다 구현 방식 이 달라 질 수 있다.Apache Tomcat 의 경우 웹 애플 리 케 이 션 마다 해당 하 는 클래스 로 더 인 스 턴 스 가 있 습 니 다.이 종류의 로 더 도 프 록 시 모드 를 사용 합 니 다.다른 것 은 먼저 어떤 종 류 를 불 러 오 려 고 시도 하 는 것 입 니 다.부모 클래스 에 로 더 를 불 러 오 는 것 을 찾 을 수 없다 면.이것 은 일반 종류의 로 더 순서 와 반대 이다.이것 은 자바 Servlet 규범 에서 추천 하 는 방법 으로 웹 응용 자체 의 우선 순위 가 웹 용기 가 제공 하 는 클래스 보다 높 도록 하 는 것 이 목적 이다.이러한 프 록 시 모드 의 예 외 는 자바 핵심 라 이브 러 리 의 종 류 는 검색 범위 안에 있 지 않다 는 것 이다.자바 핵심 라 이브 러 리 의 유형 안전 을 위해 서다.
대부분의 경우 웹 애플 리 케 이 션 개발 자 들 은 클래스 로 더 와 관련 된 세부 사항 을 고려 할 필요 가 없다.다음은 몇 가지 간단 한 원칙 을 제시한다.
웹 마다 자바 류 파일 과 사용 하 는 라 이브 러 리 의 jar 패 키 지 를 각각 적용 합 니 다.  WEB-INF/classes  화해시키다  WEB-INF/lib  목록 아래.
여러 개의 응용 프로그램 이 공유 하 는 자바 류 파일 과 jar 패 키 지 는 각각 웹 용기 가 지정 한 모든 웹 응용 프로그램 이 공유 하 는 디 렉 터 리 아래 에 놓 여 있 습 니 다.
클래스 를 찾 을 수 없 는 오류 가 발생 했 을 때 현재 클래스 의 클래스 로 더 와 현재 스 레 드 의 컨 텍스트 클래스 로 더 가 올 바른 지 확인 합 니 다.
클래스 로 더 와 웹 용기 의 관 계 를 소개 한 후 OSGi 와 의 관 계 를 소개 합 니 다.
 
클래스 로 더 와 OSGi
OSGi™ 자바 의 동적 모듈 시스템 입 니 다.이 는 개발 자 에 게 서비스 와 구성 요 소 를 기반 으로 하 는 운영 환경 을 제공 하고 소프트웨어 의 생명 주 기 를 관리 하 는 표준 방식 을 제공한다.OSGi 는 이미 많은 제품 에 구현 되 고 배 치 됐 으 며,개원 커 뮤 니 티 에서 도 폭 넓 은 지 지 를 받 고 있다.Eclipse 는 OSGi 기술 을 바탕 으로 구 축 된 것 이다.
OSGi 의 모든 모듈(bundle)은 자바 패키지 와 클래스 를 포함 합 니 다.모듈 은 가 져 오기(import)가 필요 한 다른 모듈 의 자바 패키지 와 클래스 를 설명 할 수 있 습 니 다.  Import-Package),다른 모듈 에서 사용 할 수 있 도록 가방 과 클래스 를 내 보 낼 수도 있 습 니 다(export).  Export-Package )。한 모듈 의 일부 자바 패키지 와 클래스 를 숨 기 고 공유 할 수 있어 야 한 다 는 것 이다.이것 은 OSGi 특유 의 클래스 로 더 메커니즘 을 통 해 이 루어 진 것 이다.OSGi 의 모든 모듈 에는 대응 하 는 클래스 로 더 가 있 습 니 다.모듈 에 포 함 된 자바 패키지 와 클래스 를 불 러 옵 니 다.자바 핵심 라 이브 러 리 의 클래스 를 불 러 올 때(  java  시작 하 는 패키지 클래스)는 부모 클래스 로 더(보통 시작 클래스 로 더)를 대리 합 니 다.가 져 온 자바 클래스 를 불 러 올 필요 가 있 을 때,이 자바 클래스 를 내 보 내 는 모듈 을 대리 해서 불 러 옵 니 다.모듈 도 일부 자바 패키지 와 클래스 를 명시 할 수 있 으 며,부모 클래스 로 불 러 와 야 합 니 다.시스템 속성 만 설정 하면 됩 니 다.  org.osgi.framework.bootdelegation  의 값 이면 된다.
두 개의 모듈 bundleA 와 bundleB 가 있다 고 가정 하면 모두 자신 이 대응 하 는 클래스 로 더 classLoader A 와 classLoader B 가 있 습 니 다.bundleA 에는 클래스 com.bundleA.Sample 이 포함 되 어 있 으 며,이 클래스 는 내 보 내기 로 명시 되 어 있 습 니 다.즉,다른 모듈 에서 사용 할 수 있 습 니 다.bundleB 는 bundleA 가 제공 하 는 클래스 가 져 오기  com.bundleA.Sample,그리고 하나의 종 류 를 포함 합 니 다.  com.bundleB.NewSample  잇다  com.bundleA.Sample 。bundleB 가 시 작 될 때 클래스 로 더 classLoaderB 는 클래스 를 불 러 와 야 합 니 다.  com.bundleB.NewSample,더 나 아가 로 딩 류 가 필요 합 니 다.  com.bundleA.Sample 。bundleB 가 클래스 com.bundleA.Sample 을 발 표 했 기 때문에 가 져 온 것 입 니 다.classLoader B 는 로 딩 종 류 를 가 져 옵 니 다.  com.bundleA.Sample  이러한 종류의 bundleA 클래스 로 더 classLoader A 를 내 보 냅 니 다.classLoaderA 모듈 내부 에서 클래스 찾기  com.bundleA.Sample  얻 은 클래스 를 정의 합 니 다.  com.bundleA.Sample  인 스 턴 스 는 모든 성명 에 의 해 이러한 모듈 을 가 져 와 사용 할 수 있 습 니 다.대하 다  java  시작 클래스 는 모두 부모 클래스 로 더 를 불 러 옵 니 다.시스템 속성 org.osgi.framework.bootdelegation=com.example.core.* 을 밝 혔 다 면 가방 에 대해 서 는  com.example.core  클래스 는 모두 부모 클래스 로 더 로 이 루어 집 니 다.
OSGi 모듈 의 이러한 종류의 로 더 구 조 는 하나의 서로 다른 버 전이 자바 가상 컴퓨터 에 공존 할 수 있 게 하여 매우 큰 유연성 을 가 져 왔 다.그러나 이러한 차이 점 은 개발 자 에 게 도 문 제 를 가 져 다 줄 수 있다.특히 모듈 이 제3자 가 제공 하 는 라 이브 러 리 를 사용 해 야 할 때.다음은 몇 가지 비교적 좋 은 건 의 를 제공 합 니 다.
하나의 라 이브 러 리 가 하나의 모듈 만 사용 된다 면,이 라 이브 러 리 의 jar 패 키 지 를 모듈 에 넣 고,  Bundle-ClassPath  중지 시 키 면 됩 니 다.
하나의 라 이브 러 리 가 여러 모듈 에 공용 된다 면 이 라 이브 러 리 에 하나의 모듈 을 만 들 고 다른 모듈 에 필요 한 자바 패 키 지 를 내 보 낼 수 있 습 니 다.다른 모듈 성명 은 이 종 류 를 가 져 옵 니 다.
라 이브 러 리 가 SPI 인 터 페 이 스 를 제공 하고 스 레 드 컨 텍스트 클래스 로 SPI 가 구현 하 는 자바 류 를 불 러 오 면 자바 류 를 찾 을 수 없습니다.하면,만약,만약...  NoClassDefFoundError  이상,우선 현재 스 레 드 의 상하 문 클래스 캐리어 가 정확 한 지 확인 하 십시오.통과 이런 종류의 로 더 를 얻 을 수 있다.이 종류의 로 더 는 이 모듈 에 대응 하 는 클래스 로 더 여야 합 니 다.만약 그렇지 않다 면,먼저 통과 할 수 있다.  Thread.currentThread().getContextClassLoader()  모듈 에 대응 하 는 클래스 로 더 를 얻 고 class.getClassLoader() 을 통 해 현재 스 레 드 의 컨 텍스트 클래스 로 더 를 설정 합 니 다.
 
페이지 맨 위
총결산
클래스 로 더 는 자바 언어의 혁신 이다.그것 은 소프트웨어 구성 요 소 를 동적 으로 설치 하고 업데이트 하 는 것 을 가능 하 게 한다.본 고 는 클래스 로 더 와 관련 된 화 제 를 상세 하 게 소개 했다.기본 개념,프 록 시 모델,스 레 드 컨 텍스트 로 더,웹 용기 와 OSGi 의 관계 등 을 포함한다.개발 자가 만나다  Thread.currentThread().setContextClassLoader() 과  ClassNotFoundException  이상 할 때 이상 한 클래스 의 클래스 로 더 와 현재 스 레 드 의 컨 텍스트 클래스 로 더 를 검사 해 야 합 니 다.이 를 통 해 문제 의 소 재 를 발견 할 수 있 습 니 다.자신의 클래스 로 더 를 개발 할 때 기 존의 클래스 로 더 조직 구조 와 의 조 화 를 주의해 야 한다.

좋은 웹페이지 즐겨찾기