>  기사  >  Java  >  Java의 클래스로더

Java의 클래스로더

王林
王林원래의
2024-08-30 16:04:05992검색

ClassLoader는 JVM이 ClassLoader가 Java Runtime Environment의 일부라는 사실을 인식하지 못하도록 런타임 중에 Java 클래스를 동적으로 로드하는 개체입니다. JVM 생활이 더 쉬워집니다. JVM은 애플리케이션에서 필요할 때 클래스를 메모리에 로드하며 모든 클래스를 한 번에 로드하지 않습니다. 그러면 ClassLoader가 나타나서 클래스를 메모리에 로드합니다.

무료 소프트웨어 개발 과정 시작

웹 개발, 프로그래밍 언어, 소프트웨어 테스팅 등

Java에서 ClassLoader를 구현하는 방법은 무엇입니까?

java.lang.ClassLoader가 Java 라이브러리 코드에서 어떻게 구현되고 그 기능이 무엇인지 살펴보겠습니다.

java.lang.ClassLoader:

public abstract class ClassLoader {
public class loadClass(String name);
protected class defineClass(byte[] b);
public URL getResource(String name);
public Enumeration getResources(String name);
public ClassLoader getParent()
};

Java에서 ClassLoader의 기능이 무엇인지 살펴보겠습니다.

  • loadClass(): 이것은 클래스 이름을 문자열로 취하고 클래스의 인스턴스를 다시 반환하는 중요한 메소드이며, 클래스 로더가 사용하는 클래스가 될 것입니다. 이(가) 클래스 경로에서 발견되었으며, 이 클래스 경로에서 객체가 인스턴스화될 수 있도록 이를 제공합니다.
  • defineClass(): 이 메서드는 바이트 배열을 인수로 사용하고 해당 바이트 배열에서 클래스를 생성한다는 점을 제외하면 loadClass 메서드와 유사하게 작동합니다. 즉, 클래스 자체를 가져옵니다. 바이트 배열로. 클래스 자체가 바이트 배열로 제공되는 반면, loadClass는 클래스를 로드하려면 해당 클래스를 찾아야 한다는 점에서 loadClass 메서드와 약간 다릅니다.
  • getResource() 또는 getResources(): 이 메소드는 문자열 이름과 패키지 이름. 모든 가정을 배제하고 수업이 로드되는 위치와 방법의 정확한 경로를 제공합니다.
  • getparent(): classLoader의 계층 구조를 이해하는 핵심 메소드입니다. ClassLoader는 평면 구조가 아니며 상위 및 하위 계층 구조와 구조 수준이 있습니다.

Java에서 ClassLoader는 어떻게 작동하나요?

클래스 로더 작동 방식을 보여주는 예:

코드:

public class A() {
public void addOne() {
B b = new B();
b.addTwo();
}
}

위 시나리오에서 ClassLoader가 클래스를 로드하는 방법:

  • 보시다시피 위 코드에서 클래스 A는 addOne() 함수를 호출합니다. 그리고 해당 함수 내에서 클래스 B의 인스턴스가 생성되고 클래스 B의 또 다른 메서드인 addTwo()가 호출됩니다.
  • 그래서 classLoader는 클래스 A를 로드하고, 클래스 로더는 클래스 B를 로드합니다. 따라서 호출은 class.getClassLoader().loadClass(“B”);
  • 와 같이 발생합니다.
  • 클래스 로더의 이러한 기능으로 인해 클래스의 계층 구조를 갖고 클래스 연결을 디코딩할 수 있습니다.

클래스로더의 종류

이 튜토리얼에서는 다양한 유형의 클래스 로더와 해당 내장 기능, 그리고 그것이 사용되는 이유에 대해 이야기하겠습니다.

1. 부트스트랩 클래스 로더

  • Java ClassLoader는 java.lang의 인스턴스이기도 합니다. 클래스인 ClassLoader는 누가 ClassLoader 클래스를 로드할지 상상해 보세요. Bootstrap ClassLoader가 등장하는 시나리오를 살펴보겠습니다.
  • $JAVA_HOME/jre/lib 디렉토리에서 모든 rt.jar 및 기타 핵심 라이브러리를 로드합니다.
  • 다른 모든 ClassLoader 인스턴스의 상위 역할을 합니다.
  • JVM 부분 중 하나이며 Native 코드로 작성되었습니다. 따라서 이 특정 ClassLoader에 대한 구현이 변경될 수 있습니다.

2. 확장 클래스 로더

확장 ClassLoader는 Bootstrap의 하위 항목입니다. JVM으로 들어오는 모든 Java 클래스의 확장을 로드하는 데 사용됩니다.

3. 애플리케이션 클래스로더

  • Extension ClassLoader의 하위 항목입니다.
  • classpath 환경 변수 –classpath 또는 –cp에서 모든 애플리케이션 수준 클래스를 로드하는 데 사용됩니다.

클래스 로더 누수

모든 수업에는 자신이 만든 모든 수업에 대한 링크가 있습니다. 정적 필드를 저장하려면 메모리가 있어야 합니다. classLoader가 단일 클래스의 정적 필드를 누출하는 경우 이는 ClassLoader가 누출되고 있음을 의미합니다. 그렇게 하면 모든 클래스와 여러 개체, 그리고 이들이 연결된 모든 개체가 유출됩니다. ClassLoader 누출은 너무 위험할 수 있습니다.

애플리케이션의 런타임에 재배포를 수행하거나 향상된 기능을 추가할 때마다 ClassLoader는 클래스를 로드하고 클래스를 다시 로드하거나 언로드하지 않습니다. 따라서 classLoaders가 단일 클래스를 처음부터 로드할 때 처음부터 다시 생성하거나 다시 로드하기 위해 일부 개체를 갖게 됩니다. 이전 클래스 로더는 개체를 이전 상태에서 새 상태로 보냅니다. 따라서 이 전환 과정에서 누출이 발생할 수 있습니다. 따라서 객체가 누출되면 클래스가 누출되므로 클래스 로더가 됩니다.

Principles of Java ClassLoader

There are 3 principles that a java ClassLoader works upon:

  • Delegation Model: It delegates class loading requests to parent ClassLoader and loads class only if the parent is not able to find or load the class.
  • Visibility Principle: This principle states the visibility scope of loaded classes. Class loaded by its parent is visible to parent class loaders, but the class loaded by its child is not visible to the parent class loader.
  • Uniqueness Property: It ensures that there is no repetition of classes in the class loader. If a parent loads a class, then its corresponding child does not load this class.

Example of Custom ClassLoader

This is the custom ClassLoader example named with ClassLoaderJava.java:

Code: ClassLoaderJava.java

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ClassLoaderJava extends ClassLoader{
// created to load class and invoke method.
public void classLoadingDemo(String classBinString, String methodName) {
try {
// will create an instance of class loader. ClassLoader classLoaderInstance =
this.getClass().getClassLoader();
// creating an instance of a class to store the loaded class. Class loadedClass =
classLoaderInstance.loadClass(classBinString);
System.out.println("Loaded class name is: " + loadedClass.getName());
// Fetching the constructor of loaded class. Constructor con = loadedClass.getConstructor();
// creating an instance to invoke the method. Object obj = con.newInstance();
// Will store the method fetched from loaded class.
Method invokingMethod = loadedClass.getMethod(methodName); System.out.println("Invoked method name is: " +
invokingMethod.getName());
invokingMethod.invoke(obj);
} catch (ClassNotFoundException e) { e.printStackTrace();
} catch (Exception e) { e.printStackTrace();
}
}
}

Code: DemoClass.java

public class DemoClass {
public void add() {
System.out.println("This method is invoked by the classLoader.");
}
}

Code: LoadingTest.java

public  class  LoadingTest  {
public  static  void  main(String[]  args)  {
ClassLoaderJava classLoader = new ClassLoaderJava();
classLoader.classLoadingDemo("DemoClass" , "add");
}
}

Output:

Java의 클래스로더

위 내용은 Java의 클래스로더의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.