자바 클래스 프로세서 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
이상 할 때 이상 한 클래스 의 클래스 로 더 와 현재 스 레 드 의 컨 텍스트 클래스 로 더 를 검사 해 야 합 니 다.이 를 통 해 문제 의 소 재 를 발견 할 수 있 습 니 다.자신의 클래스 로 더 를 개발 할 때 기 존의 클래스 로 더 조직 구조 와 의 조 화 를 주의해 야 한다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.