[독서 노트] Java 클래스 로더
클래스 및 클래스 캐리어
클래스 마운트는 클래스 마운트 단계의 역할을 제외하고 하나의 클래스에 대해 클래스 마운트를 하는 클래스 마운트와 이 클래스 자체가 자바 가상 기기의 유일성을 함께 확정해야 한다.통속적으로 말하자면 두 종류가'상등'인지 아닌지를 판단하려면 전제는 이 두 종류는 반드시 같은 종류의 캐리어에 불러와야 한다. 그렇지 않으면 이 두 종류는'상등하지 않다'는 것이다.여기서 가리키는'상등'은 클래스의 클라스 대상의
equals()
방법, isAssignableFrom()
방법, isInstance()
방법, instanceof
키워드 등을 포함하여 판단한 결과이다.예: 서로 다른 클래스 마운트가 instanceof 키워드 결과에 미치는 영향
package org.kesar;
import java.io.IOException;
import java.io.InputStream;
public class ClassLoaderTest
{
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception
{
ClassLoader myLoader = new ClassLoader()
{
@Override
public Class<?> loadClass(String name)
throws ClassNotFoundException
{
try
{
String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
InputStream is = getClass().getResourceAsStream(fileName);
if (is == null)
{
return super.loadClass(name);
}
byte[] b = new byte[is.available()];
is.read(b);
return defineClass(name, b, 0, b.length);
}
catch (IOException e)
{
throw new ClassNotFoundException(name);
}
}
};
Object obj=myLoader.loadClass("org.kesar.ClassLoaderTest").newInstance();
System.out.println(obj.getClass());
System.out.println(obj instanceof ClassLoaderTest);
}
}
:
class org.kesar.ClassLoaderTest
false
:
ClassLoaderTest , , , “ ”。
2. 양친위 파견 모델
Java , 。 (Bootstrap ClassLoader), ; , , java.lang.ClassLoader
. 시스템에서 제공하는 클래스 마운트에 대해 말하자면, 이 세 종류의 마운트가 있다. 부팅 클래스 마운트, 확장 클래스 마운트, 응용 프로그램 클래스 마운트이다.
1. 시스템의 클래스 로더
(1) 부팅 클래스 로더(Bootstrap ClassLoader) 로딩 내용: <JAVA_HOME>\lib
디렉터리, -Xbootclasspath
매개 변수가 지정한 경로에 있는 가상 기기가 식별할 수 있는 클래스 라이브러리가 가상 기기 메모리에 로딩됩니다.특징: 자바 프로그램에서 직접 인용할 수 없습니다. 마운트 의뢰를 시작 클래스 마운트에 불러오려면 null로 대체하면 됩니다.
예: java.lang.Class의 getClassLoader () 소스
/**
* Returns the class loader for the class. Some implementations may use
* null to represent the bootstrap class loader. This method will return
* null in such implementations if this class was loaded by the bootstrap
* class loader.
*/
public ClassLoader getClassLoader() {
ClassLoader cl = getClassLoader0();
if (cl == null)
return null;
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
ClassLoader.checkClassLoaderPermission(cl, Reflection.getCallerClass());
}
return cl;
}
(2) 확장 클래스 로더(Extension ClassLoader) 로딩 내용: <JAVA_HOME>\lib\ext
디렉터리, java.ext.dirs
시스템 변수에 의해 지정된 경로의 모든 클래스 라이브러리 특징: 자바 컴파일링을 사용하여 개발자가 확장 클래스 로더를 직접 사용할 수 있음
(3) 응용 프로그램 클래스 로더(Application ClassLoader) 로딩 내용: 사용자 클래스 경로(ClassPath)에 지정된 클래스 라이브러리 특징을 로딩합니다. 개발자는 이 클래스 로더를 직접 사용할 수 있습니다. 사용자 정의 클래스 로더가 없으면 기본적으로 사용할 수 있습니다.
2. 부모 위임 모델(Parents Delegation Model)
작업 과정: 클래스 로더가 클래스 로더 요청을 받았을 때 클래스를 직접 로드하지 않습니다. 이 클래스 로더 요청은 상위 클래스 로더에 위임됩니다. 각 단계의 클래스 로더는 이렇게 합니다. 이 클래스가 상위 클래스가 없을 때(Bootstrap ClassLoader) 또는 상위 클래스 로더의 피드백이 이 클래스를 로드할 수 없을 때(검색 범위에서 필요한 클래스를 찾지 못했을 때)서브 캐리어가 스스로 불러옵니다.
클래스의 부모 위임 모델은 다음과 같다.
장점: 양친위 파견 모델을 사용하면 작업 과정의 특징으로 인해 자바 클래스는 클래스 로더와 함께 우선순위가 있는 차원 관계를 가지게 된다(차원이 높을수록 우선순위가 있다).예를 들어 java.lang.Object
은 모든 클래스가 기본적으로 이 클래스를 계승하기 때문에 매번 클래스가 불러올 때마다 이 클래스를 불러온다. 이 클래스는 rt.jar
에 존재하고 부모위 파견 모델을 사용하면 매번 클래스 가치 요청은 시작 클래스 캐리어에 위임되기 때문에 java.lang.Object
에 성공적으로 불러올 수 있다.그리고 java.lang.Object
의 매번 위임은 부팅 클래스 마운트에 의해 불러오기 때문에 클래스가 가상 기기에서의 일치성을 확보한다.만약 이러한 메커니즘을 잃게 된다면, 모든 클래스 마운트는 자신을 java.lang.Object
으로 불러올 것이다. 그러면 시스템에 서로 다른 Object
클래스가 여러 개 있을 것이고, 응용 프로그램은 혼란스러울 것이다.
ClassLoader의 loadClass() 메소드 소스를 볼 수 있습니다.
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// ,
Class c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException
//
}
if (c == null) {
// ,
long t1 = System.nanoTime();
c = findClass(name);
// this is the defining class loader; record the stats
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
3. 부모위 파견 모형 세 차례 파괴
(1) :JDK
:JDK1.2 。JDK1.0 ClassLoader , , ClassLoader findClass() 。 , findClass() 。
:JDK1.2 , ClassLoader loadClass() , loadClass() , findClass() 。
(2) :
: 。 JNDI ,JNDI Java , , ClassPath JNDI , “ ” 。
: (Thread Context ClassLoader), , , 。
(3) :“ ”
: : 、 。
: Java OSGI, , , 。
:OSGI
1) java.* 。
2) , 。
3) , Import Export Bundle 。
4) , Bundle ClassPath, 。
5) , Fragment Bundle , , Fragment Bundle 。
6) , Dynamic Import Bundle, Bundle 。
7) , 。
(Wiz)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.