문제

누구든지 나에게 좋은 자원을 가리키거나 클래스 로더의 개념에 대해 설명 할 수 있습니까? 클래스 로더에서 다음 자원을 찾았습니다 http://www.onjava.com/lpt/a/5586 그러나 여전히 도움이되지 않습니다. 다음 질문은 어리석은 것처럼 보일지 모르지만 대답하려고하는 것은 항상 나를 혼란스럽게합니다.

  • 개발자가 사용자 정의 클래스 로더를 작성하는 이유는 무엇입니까? 부트 스트랩 클래스 로더를 호출하여 사용자 정의 클래스를 호출하지 않겠습니까? 사용자 정의 클래스 로더를 정의해야 할 필요성은 무엇입니까?
  • 왜 그렇게 많은 종류의 클래스 로더가 있습니까? 예 : 부츠 랩, 커먼, 카탈리나 클래스 로더 등,

    미리 감사드립니다.

도움이 되었습니까?

해결책

맞춤형 클래스 로더를 만드는 데 다음과 같은 유효한 이유를 발견했습니다.

  1. 비 전통적인 소스에서 클래스를로드하려고합니다 (예 : 한 클래스의 바이트 코드는 데이터베이스, 네트워크 또는 네트워크 또는 Pidgeons에 의해 0과 1으로 운반됩니다 - MessengerPidgeonClassLoader). API에 이미 일부 클래스 로더 구현이 있습니다. UrlClassloader.

  2. 클래스를로드하려면 다른 계층을 정의해야합니다. 클래스 로더의 기본 구현은 먼저 검색을 부모에게 위임 한 다음 클래스 스스로로드하려고합니다. 어쩌면 당신은 다른 계층을 원할 것입니다. 이것이 OSGI와 Eclipse가 Manifest .MF 파일이 모든 유형의 이상한 계층 구조 경로 (예 : 버디 클래스로드)를 정의하기 때문에 자체 클래스 로더를 갖는 이유입니다. 모든 Eclipse 클래스 로더는 Bundleclassloader 인터페이스를 구현하고 Eclipse 플러그인 내에서 리소스를 찾을 수있는 추가 코드가 있습니다.

  3. 바이트 코드에 대한 수정을 수행해야합니다. 어쩌면 바이트 코드가 암호화되어 있으면 즉석에서 암호화하지 않을 것입니다 (실제로 도움이되지는 않지만 시도되었습니다.). 어쩌면 당신은 즉시로드 된 클래스 (la jdo bytecode 향상)를 "패치"하고 싶을 것입니다.

메모리에서 클래스를 내리지 않거나 런타임시 정의를 변경할 수있는 것보다 클래스를로드 해야하는 경우 시스템 클래스 로더와 다른 클래스 로더를 사용해야합니다. 일반적인 경우는 예를 들어 XML 파일에서 즉시 클래스를 생성 한 다음이 클래스를 다시로드하려고하는 응용 프로그램입니다. 클래스가 시스템 클래스 로더에 들어가면 언로드하고 새로운 정의를 가질 수있는 방법이 없습니다.

다른 팁

클래스 로더의 일반적인 사용은 항아리를 분리하는 것입니다. 플러그인을 사용하는 응용 프로그램이있는 경우 (, Maven 2), 그러면이 상황을 가질 수 있습니다. 플러그인 X는 버전 1.0이있는 jar a가 필요하지만 플러그인 y는 동일한 JAR이지만 버전 2.0이 필요합니다. 그러나 X는 버전 2.0으로 실행되지 않습니다.

클래스 로더가있는 경우 클래스 파티션을 만들 수 있습니다 (얇은 다리로 연결된 고립 된 섬을 생각하십시오. 교량은 클래스 로더입니다). 이런 식으로 클래스 로더는 각 플러그인이 볼 수있는 것을 제어 할 수 있습니다.

플러그인 X가 정적 필드가있는 클래스 FOO를 인스턴스화 할 때, 이것은 문제가되지 않으며 플러그인 Y의 "동일한"클래스와 믹스 업이 없을 때 각 클래스 로더는 실제로 클래스 FOO의 자체 인스턴스를 생성하기 때문입니다. 그런 다음 메모리에 두 개의 클래스가 있습니다 cl1.getName().equals(cl2.getName()) ~이다 true 하지만 cl1.equals(cl2) 아니다. 이는 CL1 인스턴스가 CL2 인스턴스와 호환되지 않는다는 것을 의미합니다. 이것은 이상하게 이어질 수 있습니다 ClassCastExceptions 그것은 그렇게 말합니다 org.project.Foo 할당 할 수 없습니다 org.project.Foo.

외딴 섬과 마찬가지로 두 클래스는 다른 클래스가 존재한다는 것을 알지 못합니다. 다른 섬에서 태어나고 자란 인간 복제품을 생각해보십시오. VM의 관점에서, 유형 클래스의 인스턴스가 다른 객체와 같이 처리되기 때문에 문제가 없습니다. 몇 가지가있을 수 있습니다. 당신은 그들 중 일부가 "동일"이라고 생각한다는 것은 VM에 중요하지 않습니다.

이 패턴의 또 다른 용도는이 방법으로로드 된 클래스를 제거 할 수 있다는 것입니다. 클래스 로더에서로드 된 클래스에서 생성 된 객체에 대한 포인터가 없도록하고 클래스 로더를 잊어 버리십시오. 다음 달리기에서 GC,이 클래스 로더로로드 된 모든 클래스는 메모리에서 제거됩니다. 이를 통해 전체 VM을 다시 시작하지 않고도 응용 프로그램을 "로드"할 수 있습니다.

제가 과거에 쓴 몇 개의 블로그는 사후 수후 클래스 로더 사용에 대해 다음과 같습니다.

이와 같은 경우 원료를 지나갈 수 없습니다. 만약 너라면 진짜 내부 마약을 원합니다 하드 코어, 읽다 Java Virtual Machine 사양의 관련 비트.

Java 클래스 로더를위한 또 다른 좋은 링크 - 자바 클래스 로더

자신만의 클래스 로더를 만들어야하는 것은 매우 드 rare니다. 그리고 당신이 필요하다면, 당신은 이미 클래스 로더가하는 일에 대해 정말 잘 이해해야합니다.

다시 말해, 왜 자신의 클래스 로더를 만들어야하는지 묻는다면, 당신은 하나를 만들 필요가 없습니다;)

즉, 나는 또한 암호화를 다루는 응용 프로그램을 위해 클래스 로더가 생성되는 것을 보았습니다. 이 방법으로 JVM 버전을 사용하는 대신 Java.NetSocket 또는 일부 파일/스트림 객체를 만들 때마다 자체 특수 사용자 정의 내장 클래스를 사용합니다. 이런 식으로 그들은 모든 정보가 암호화되고 개발자 오류가 없음을 보장 할 수 있습니다.

그러나 그것은 일반적이지 않습니다. 자신만의 커스텀 클래스 로더를 만들 필요없이 Java 경력을 쌓을 수 있습니다. 실제로 하나를 만들어야한다면 실제로 필요한지 물어봐야합니다.

개발자가 사용자 정의 클래스 로더를 작성하는 이유는 무엇입니까? 부트 스트랩 클래스 로더를 호출하여 사용자 정의 클래스를 호출하지 않겠습니까? 사용자 정의 클래스 로더를 정의해야 할 필요성은 무엇입니까?

응용 프로그램에 따라 개발자는 자신의 요구에 맞게 클래스 로딩 메커니즘을 무시하거나 완전히 대체 할 수 있습니다.

예를 들어 LDAP : S에서 클래스가로드되는 하나의 응용 프로그램을 사용했습니다.

다른 앱에는 독립적 인 클래스 관리가 필요합니다 (핫 배포를 지원하는 대부분의 애플리케이션 서버와 같이)

리소스에 관해, 웹에는 단순히 나열 될 수없는 톤이 있습니다.

An example:

Tomcat은 맞춤형 WebAppClassLoader를 사용하여 다양한 웹 애플리케이션에서 클래스/항아리를로드하고 분리합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top