IT story

Java ClassLoader 란 무엇입니까?

hot-time 2020. 5. 26. 07:49
반응형

Java ClassLoader 란 무엇입니까?


몇 가지 간단한 문장에서 Java ClassLoader는 무엇이며 언제 사용되며 왜 그런가?

좋아, 나는 위키 기사를 읽었다. ClassLoader는 클래스를로드합니다. 확인. jar 파일을 포함하고 가져 오면 ClassLoader가 작업을 수행합니다.

이 ClassLoader를 왜 귀찮게해야합니까? 나는 그것을 사용한 적이 없으며 그것이 존재하는지 몰랐다.

문제는 ClassLoader 클래스가 존재하는 이유는 무엇입니까? 또한 실제로 어떻게 사용합니까? (사례가 존재합니다.)


이 멋진 튜토리얼 에서 가져 왔습니다.

자극

C 및 C ++와 같이 정적으로 컴파일 된 프로그래밍 언어로 작성된 응용 프로그램은 시스템 고유의 명령어로 컴파일되어 실행 파일로 저장됩니다. 코드를 실행 가능한 원시 코드로 결합하는 프로세스를 링크라고합니다. 별도로 컴파일 된 코드를 공유 라이브러리 코드와 병합하여 실행 가능한 응용 프로그램을 만듭니다. 이것은 Java와 같이 동적으로 컴파일 된 프로그래밍 언어에서 다릅니다. Java에서 Java 컴파일러에 의해 생성 된 .class 파일은 JVM (Java Virtual Machine)에로드 될 때까지 그대로 유지됩니다. 즉, 링크 프로세스는 런타임시 JVM에 의해 수행됩니다. 클래스는 '필요한'기준으로 JVM에로드됩니다. 로드 된 클래스가 다른 클래스에 종속되면 해당 클래스도로드됩니다.

Java 응용 프로그램이 시작되면 실행할 첫 번째 클래스 (또는 응용 프로그램의 진입 점)는 main ()이라는 공용 정적 void 메서드가있는 클래스입니다. 이 클래스에는 일반적으로 다른 클래스에 대한 참조가 있으며 참조 된 클래스를로드하려는 모든 시도는 클래스 로더에 의해 수행됩니다.

이 재귀 클래스 로딩과 일반적인 클래스 로딩 아이디어를 얻으려면 다음과 같은 간단한 클래스를 고려하십시오.

public class HelloApp {
   public static void main(String argv[]) {
      System.out.println("Aloha! Hello and Bye");
   }
}

로드되는 클래스를 인쇄하도록 -verbose : class 명령 행 옵션을 지정하여이 클래스를 실행하면 다음과 같은 출력이 표시됩니다. 목록이 너무 길어서 여기에 표시 할 수 없으므로 이것은 부분 출력 일뿐입니다.

prmpt>java -verbose:class HelloApp



[Opened C:\Program Files\Java\jre1.5.0\lib\rt.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jsse.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jce.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\charsets.jar]
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
[Loaded java.lang.reflect.Type from shared objects file]
[Loaded java.lang.reflect.AnnotatedElement from shared objects file]
[Loaded java.lang.Class from shared objects file]
[Loaded java.lang.Cloneable from shared objects file]
[Loaded java.lang.ClassLoader from shared objects file]
[Loaded java.lang.System from shared objects file]
[Loaded java.lang.Throwable from shared objects file]
.
.
.
[Loaded java.security.BasicPermissionCollection from shared objects file]
[Loaded java.security.Principal from shared objects file]
[Loaded java.security.cert.Certificate from shared objects file]
[Loaded HelloApp from file:/C:/classes/]
Aloha! Hello and Bye
[Loaded java.lang.Shutdown from shared objects file]
[Loaded java.lang.Shutdown$Lock from shared objects file]

보다시피, 애플리케이션 클래스 (HelloApp)에 필요한 Java 런타임 클래스가 먼저로드됩니다.

Java 2 플랫폼의 클래스 로더

Java 프로그래밍 언어는 계속해서 애플리케이션 개발자의 삶을 편하게 만들어줍니다. 이는 기본 메커니즘의 구현 세부 사항이 아닌 비즈니스 로직에 집중할 수 있도록하여 생활을 단순화하는 API를 제공함으로써 수행됩니다. 이것은 Java 플랫폼의 성숙도를 반영하기 위해 최근 J2SE 1.5에서 J2SE 5.0으로 변경 한 것이 분명합니다.

JDK 1.2부터 JVM에 내장 된 부트 스트랩 클래스 로더는 Java 런타임의 클래스를로드합니다. 이 클래스 로더는 부트 클래스 경로에있는 클래스 만로드하며, 신뢰할 수있는 클래스이기 때문에 신뢰할 수없는 클래스와 마찬가지로 유효성 검사 프로세스가 수행되지 않습니다. JVM에는 부트 스트랩 클래스 로더 외에 표준 확장 API에서 클래스를로드하는 확장 클래스 로더와 일반 클래스 경로 및 애플리케이션 클래스에서 클래스를로드하는 시스템 클래스 로더가 있습니다.

하나 이상의 클래스 로더가 있기 때문에 루트가 부트 스트랩 클래스 로더 인 트리에 표시됩니다. 각 클래스 로더에는 상위 클래스 로더에 대한 참조가 있습니다. 클래스 로더가 클래스를로드하도록 요청하면 항목 자체를로드하기 전에 상위 클래스 로더를 참조합니다. 부모는 차례로 부모와 상담합니다. 따라서 모든 조상 클래스 로더가 현재 클래스 로더와 관련된 클래스를 찾을 수없는 경우에만 발생합니다. 즉, 위임 모델이 사용됩니다.

java.lang.ClassLoader 클래스

The java.lang.ClassLoader is an abstract class that can be subclassed by applications that need to extend the manner in which the JVM dynamically loads classes. Constructors in java.lang.ClassLoader (and its subclasses) allow you to specify a parent when you instantiate a new class loader. If you don't explicitly specify a parent, the virtual machine's system class loader will be assigned as the default parent. In other words, the ClassLoader class uses a delegation model to search for classes and resources. Therefore, each instance of ClassLoader has an associated parent class loader, so that when requested to find a class or resources, the task is delegated to its parent class loader before attempting to find the class or resource itself. The loadClass() method of the ClassLoader performs the following tasks, in order, when called to load a class:

If a class has already been loaded, it returns it. Otherwise, it delegates the search for the new class to the parent class loader. If the parent class loader doesn't find the class, loadClass() calls the method findClass() to find and load the class. The finalClass() method searches for the class in the current class loader if the class wasn't found by the parent class loader.


There's more in the original article, which also shows you how to implement your own network class loaders, which answers your question as to why (and how). See also the API docs.


Most Java developers will never need to explicitly use class loaders (except to load resources so that it still works when they're bundled in JARs), let alone write their own.

ClassLoaders are used in large systems and server applications to do things like:

  • Modularize a system and load, unload and update modules at runtime
  • Use different versions of an API library (e.g. an XML parser) in parallel
  • Isolate different applications running within the same JVM (ensuring they don't interfere with each other, e.g. through static variables)

The question is "Why should one bother this ClassLoader class exists" ?

Well, mostly so you can fix things if they go wrong :-).

It's true, as long as you just write an application, compile it to a JAR and maybe include a few extra library JARs, you don't need to know about class loaders, it will just work.

Still, it is helpful to know a bit about class loaders and class loading to better understand what goes on behind the scenes. As an example, "static initializers" will run when a class is loaded, so to understand when they will run, you need to know how the class loader decides when to load them.

also.. how do you use it in practice ?

For simple cases, you don't need them. However, if you need to load code dynamically at runtime with explicit control where it comes from (e.g. loading over a network, loading plugins not available at compile time, etc.), you may need to do more. Then you can e.g. write your own class loader. See the other answers for links.


ClassLoader in Java is a class which is used to load class files in Java. Java code is compiled into class file by javac compiler and JVM executes Java program, by executing byte codes written in class file.

ClassLoader is responsible for loading class files from file system, network or any other source. There are three default class loader used in Java, Bootstrap , Extension and System or Application class loader.

ClassLoader


How ClassLoader works

## ClassLoader interaction with JVM enter image description here

More @ : how-classloader-works-in-java.html


Class Loaders are a functional component of JVM, which loads class data from the '.class' file or from over the network in to the Method Area in Heap.

Looks like a integral part of the JVM, but as an end java user why should I be concerned? Here is why:

Each class loader has it's own name space and classes invoked by a particular class loader gets into it's name space.

Classes invoked by two different class loaders will not have visibility over each other, resulting in enhanced security.

Class loader parent child delegation mechanism ensures java api classes could never be hacked by unauthorized code.

For details look here


Class loaders are hierarchical. Classes are introduced to the JVM as they are referenced by name in a class that is already running in the JVM.

How the very first class loaded?
The very first class is loaded with the help of static main() method declared in your class. All the subsequently loaded classes are loaded by the classes, which are already loaded and running.

A class loader creates a namespace. All JVM include at least one class loader that is embedded within the JVM called the primordial (or bootstrap) class loader. That is one thing, and we will look at non-primordial class loaders. The JVM has hooks in it to allow user defined class loaders to be used in place of primordial class loader. Here are the class loaders created by the JVM.

Bootstrap (primordial) This class loader not re loadable. Loads JDK internal classes, java.* packages ( typically loads rt.jar and i18n.jar). Extesions This class loader not re loadable. Loads jar files from JDK extensions directory (usually lib/ext of JRE). System This class loader not re loadable. Loads classes from system class path.

http://www.sbalasani.com/2015/01/java-class-loaders.html


When you asking why does the ClassLoader class exist, the reason is pretty simple - it's the class responsible for finding and loading class files at run time.

Let's elaborate it.

In JVM, every Class is loaded by some instance of java.lang.ClassLoader. Whenever a new JVM is started by you usual Java program launching java <classname> command, the first step is to load all the key classes in memory required for proper working like java.lang.Object and other runtime classes (rt.jar).

Now, there are actually 3 parts to ClassLoader:

  • The BootstrapClassLoader is responsible for making these classes available i.e. loading these classes in memory.

  • The next task is to load any external libraries / JARs into the memory for proper working of the application. The ExtClassLoader is responsible for this task. This class loader is responsible for loading all the .jar files mentioned in java.ext.dirs path.

  • The third and the main important class loader is the AppClassLoader. The application class loader is responsible for loading of the class files mentioned in the java.class.path system property.

It's also important to note that the default ClassLoader implementations could be overridden enabling you to customize the JVM in useful and interesting ways, allowing you to completely redefine how class files are brought into the system.

enter image description here

Check it out to learn more about Java Class Loader.

참고URL : https://stackoverflow.com/questions/2424604/what-is-a-java-classloader

반응형