Java에서 ClassLoader의 역할은 무엇입니까?



이 기사는 Java에서 ClassLoader가 작동하는 방식에 대한 포괄적 인 안내서입니다. Java에서 ClassLoader의 유형, 원리 및 메소드에 대해 설명합니다.

Java로 작업하는 동안 우리는 종종 많은 수의 클래스를 사용합니다. 이러한 Java 클래스는 메모리에 한 번에 모두로드되지 않고 대신 응용 프로그램에서 필요할 때로드됩니다. 이것이 Java ClassLoader가 등장하는 곳입니다. 따라서이 기사에서는 예제와 함께 Java에서 ClassLoader를 사용하는 방법에 대해 설명합니다.

이 기사에서는 다음 주제를 다룹니다.





  1. ClassLoader 란 무엇입니까?
  2. ClassLoader의 유형
  3. ClassLoader의 원리
  4. ClassLoader의 메서드
  5. 커스텀 클래스 로더

시작합시다!

Java의 ClassLoader는 무엇입니까?

Java의 ClassLoader는 Java Runtime Environment에서 호출되어 응용 프로그램에서 필요할 때마다 클래스를 동적으로로드합니다. 자바 가상 머신 . ClassLoader는 Java Runtime Environment의 일부이기 때문에 Java Virtual Machine은 기본 파일 및 파일 시스템에 대해 전혀 알지 못합니다.



이제 Java에 내장 된 다양한 유형의 ClassLoader에 대해 알아 보겠습니다.

Java의 ClassLoader 유형

Java의 다양한 유형의 ClassLoader는 다음과 같습니다.

그들 각각에 대해 하나씩 논의합시다.



확장 ClassLoader

이름에서 알 수 있듯이 Extension ClassLoader는 핵심 Java 클래스의 확장을 JDK 확장 라이브러리. Bootstrap ClassLoader의 자식이며 JRE / lib / text 디렉토리 또는 java.ext.dirs 시스템 속성에 지정된 다른 디렉토리에서 확장을로드합니다.

응용 프로그램 또는 시스템 클래스 로더

응용 프로그램 또는 시스템 클래스 로더는 확장 클래스 로더의 자식입니다. 이 유형의 ClassLoader는 -cp 명령 줄 옵션 또는 int CLASSPATH 환경 변수에있는 모든 응용 프로그램 수준 클래스를로드합니다.

부트 스트랩 클래스 로더

우리 모두 알고 있듯이 자바 클래스 의 인스턴스에 의해로드됩니다. java.lang.ClassLoade. 그러나 ClassLoader는 클래스이기 때문에 Bootstrap ClassLoader는 JDK 내부 클래스를로드합니다. BootStrap ClassLoader는 JVM이 호출 할 때 작업을 시작하고 rt.jar에서 클래스를로드하는 기계 코드입니다. 따라서 Bootstrap ClassLoader가 제공하는 상위 ClassLoader가 없으므로 Primordial ClassLoader라고 함을 이해할 수 있습니다.

노트 : Bootstrap의 우선 순위는 Extension보다 높고 Extension ClassLoader에 지정된 우선 순위는 Application ClassLoader보다 높습니다. 아래 이미지를 참조하십시오.

자바에서 클라이언트 서버 소켓 프로그래밍

ClassLoader 유형-Java의 ClassLoader-Edureka

이 기사에서는 ClassLoader가 작동하는 원리를 이해하겠습니다.

Java에서 ClassLoader의 원리

Java ClassLoader가 작동하는 규칙 세트는 다음 세 가지 원칙입니다.

그들 각각을 이해합시다.

고유성 속성

이 속성은 클래스가 반복되지 않고 모든 클래스가 고유하도록합니다. 고유성 속성은 또한 부모 ClassLoader에서로드 한 클래스가 자식 ClassLoader에서로드되지 않도록합니다. 부모 ClassLoader가 클래스를 찾을 수없는 시나리오에서는 현재 인스턴스가 자체적으로이를 시도합니다.

위임 모델

Java의 ClassLoader는 위임 모델에서 제공하는 일련의 작업을 기반으로 작동합니다. 따라서 클래스 또는 리소스를 찾기위한 요청이 생성 될 때마다 ClassLoader 인스턴스는 클래스 또는 리소스 검색을 상위 ClassLoader에 위임합니다.

ClassLoader가 작동하는 일련의 작업은 다음과 같습니다.

  • Java Virtual Machine은 클래스가 발견 될 때마다 클래스가로드되었는지 여부를 확인합니다.
  • 클래스가로드 된 경우 JVM 클래스 실행을 진행하지만 클래스가로드되지 않은 시나리오에서는JVM은 Java ClassLoader 하위 시스템에 특정 클래스를로드하도록 요청합니다. 그 후, ClassLoader 하위 시스템은 Application ClassLoader에 대한 제어를 제공합니다.
  • 그런 다음 Application ClassLoader는 요청을 Extension ClassLoader에 위임 한 다음 요청을 Bootstrap ClassLoader에 전달합니다.
  • 이제 Bootstrap ClassLoader는클래스가 사용 가능한지 여부를 확인하기위한 부트 스트랩 클래스 경로. 클래스가 사용 가능하면로드되고 그렇지 않으면 요청이 확장 클래스 로더에 다시 전달됩니다.
  • Extension ClassLoader는 확장 클래스 경로에서 클래스를 확인합니다.클래스를 사용할 수 있으면로드되고 그렇지 않으면 요청이 다시 Application ClassLoader에 전달됩니다.
  • 마지막으로, 애플리케이션 클래스 로더는 애플리케이션 클래스 경로에서 클래스를 검색합니다.클래스를 사용할 수 있으면로드되고 그렇지 않으면 ClassNotFoundException 예외가 표시됩니다.

아래 이미지를 참조하십시오.

가시성 원칙

이 원칙에 따라 하위 클래스는 상위 ClassLoader에 의해로드 된 클래스에 표시되지만 그 반대의 경우도 마찬가지입니다. 따라서 Application ClassLoader에 의해로드 된 클래스는 Extension 및 Bootstrap ClassLoader에 의해로드 된 클래스를 볼 수 있습니다.

예를 들어, A와 B라는 두 개의 클래스가있는 경우 클래스 A는 응용 프로그램 클래스 로더에 의해로드되고 클래스 B는 확장 클래스 로더에 의해로드된다고 가정합니다. 여기서 클래스 A와 B는 Application ClassLoader에 의해로드 된 모든 클래스에 표시되지만 클래스 B는 Extension ClassLoader에 의해로드 된 클래스에만 표시됩니다.

또한 Bootstrap ClassLoader를 사용하여 이러한 클래스를로드하려고하면 java.lang.ClassNotFoundException . 예외.

자, 이제 ClassLoader의 유형과 그 뒤에있는 원리를 알았으니 몇 가지 중요한 메서드를 살펴 보겠습니다.~로부터 java.lang.ClassLoader 수업.

Java의 ClassLoader 메소드

필수 ClassLoader의 구성은 다음과 같습니다.

loadClass (문자열 이름, 부울 해석)

이 메소드는 ClassLoader의 진입 점이며 JVM에서 참조하는 클래스를로드하는 데 사용됩니다. 의 이름이 필요합니다. 매개 변수로. JVM은 부울 값을 true로 설정하여 클래스 참조를 분석하기 위해 loadClass () 메소드를 호출합니다. 클래스의 존재 여부를 결정해야하는 경우에만 부울 매개 변수가 false로 설정됩니다.

C ++에서 mergesort

선언:

public 클래스 loadClass (문자열 이름, 부울 해결) throws ClassNotFoundException {

defineClass ()

클래스의 인스턴스로 바이트 배열을 정의하는 데 사용되는 마지막 메서드입니다. 클래스가 유효하지 않은 경우 ClassFormatError가 발생합니다.

선언:

protected final Class defineClass (String name, byte [] b, int off, int len) throws ClassFormatError

findClass (문자열 이름)

findClass 메소드는 지정된 클래스를 찾는 데 사용됩니다. 따라서 매개 변수로 정규화 된 이름을 가진 클래스를 찾지 만 클래스를로드하지는 않습니다. loadClass () 메서드는 부모 ClassLoader가 요청 된 클래스를 찾을 수없는 경우이 메서드를 호출합니다. 또한 ClassLoader의 부모가 클래스를 찾지 못하면 기본 구현에서 ClassNotFoundException.

선언:

보호 된 클래스 findClass (문자열 이름)에서 ClassNotFoundException 발생

Class.forName (문자열 이름, 부울 초기화, ClassLoader 로더)

이 메서드는 클래스를로드하고 초기화하는 데 사용됩니다. ClassLoader 중 하나를 선택할 수있는 옵션을 제공하고 ClassLoader 매개 변수가 NULL 인 경우 자동으로 Bootstrap ClassLoader가 사용됩니다..

선언:

공용 정적 클래스 forName (문자열 이름, 부울 초기화, 클래스 로더 로더)이 ClassNotFoundException을 발생시킵니다.

getParent ()

getParent 메서드는 위임을 위해 부모 ClassLoader를 반환하는 데 사용됩니다.

선언:

public final ClassLoader getParent ()

getResource ()

이름에서 알 수 있듯이 getResource () 메서드는 주어진 이름을 가진 리소스를 찾으려고했습니다. 처음에는 요청을 리소스의 상위 ClassLoader에 위임합니다. 부모가 null 인 경우 JVM에 내장 된 ClassLoader의 경로를 검색합니다. 이제 이것이 실패하면 메서드는 findResource (String)를 호출하여 리소스를 찾습니다. 여기서 리소스 이름은 절대 또는 상대 클래스 경로가 될 수있는 입력으로 지정됩니다. 그런 다음 리소스를 읽기위한 URL 개체를 반환하거나 리소스에 리소스를 반환 할 수있는 적절한 권한이 없거나 찾을 수없는 경우 null 값을 반환합니다.

선언:

공용 URL getResource (문자열 이름)

다음으로 Java의 ClassLoader에 대한이 기사에서 Custom ClassLoader를 이해해 보겠습니다.

Java의 사용자 정의 ClassLoader

내장 된 ClassLoader는 파일이 이미 파일 시스템에있는 대부분의 경우를 처리하지만 로컬 하드 드라이브에서 클래스를로드하려면 사용자 정의 ClassLoader를 사용해야합니다.

사용자 정의 ClassLoader 생성

사용자 정의 ClassLoader를 생성하려면 ClassLoader 클래스 및 재정의 findClass () 방법:

예 : 기본 ClassLoader를 확장하고 지정된 파일에서 바이트 배열을로드하는 사용자 정의 ClassLoader를 만들어 보겠습니다. 아래 코드를 참조하십시오.

package edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class Sample extends ClassLoader {@Override public Class findClass (String samplename) throws ClassNotFoundException {byte [] b = customLoadClassFromFile (샘플 이름) return defineClass (samplename, b, 0, b.length)} private byte [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ( '.', File. separatorChar) + '.class') byte [] buffer ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () return buffer}}

이것으로 우리는 Java의 ClassLoader에 대한이 기사를 마칩니다. Java의 ClassLoader, 메서드, 다양한 유형의 ClassLoader 등을 이해했으면합니다.

'ClassLoader in Java'에서이 기사를 찾았다면 전 세계에 걸쳐 250,000 명 이상의 만족 한 학습자 네트워크를 보유한 신뢰할 수있는 온라인 학습 회사 인 Edureka에서 작성했습니다. 우리는 당신의 여정의 모든 단계에서 당신을 돕기 위해 여기에 있습니다.이 자바 인터뷰 질문 외에도 우리는 학생과 전문가가되기를 원하는 전문가를 위해 고안된 커리큘럼을 마련했습니다. 자바 개발자.

질문이 있으십니까? 이 'Java의 ClassLoader'의 주석 섹션에 언급하십시오. ' 가능한 한 빨리 연락 드리겠습니다.