怪我咯2017-04-18 10:53:03
Class.forName
과 ClassLoader.loadClass
의 차이점을 이해하려면 먼저 JVM의 클래스 로딩 단계를 이해해야 합니다.
클래스 로딩은 다음 단계로 나눌 수 있습니다
로드: 정규화된 이름을 통해 클래스의 바이너리 스트림을 얻은 다음 JVM에 로드합니다.
확인: 클래스 파일의 바이트 스트림에 포함된 정보가 가상 머신의 요구 사항을 충족하고 가상 머신의 보안을 위협하지 않는지 확인
준비: 클래스 변수에 대한 메모리 공간을 할당하고 클래스 변수의 초기값을 설정
분석
초기화: 사용자가 지정한 코드에 따라 필드 및 기타 리소스를 초기화하고 정적 블록을 실행합니다.
지날 때:
으아아아을 사용하여 클래스를 가져오는 경우 실제로는 Class.forName(className, true, currentLoader)
을 호출하는 것과 같습니다. 이 메서드의 두 번째 매개 변수는 클래스를 초기화해야 하는지 여부를 나타냅니다. 따라서 Class.forName을 가져옵니다. 클래스 객체는 자동으로 초기화됩니다.true
그리고 Class.forName이 로드한 클래스의 ClassLoader는
이 호출된 클래스의 ClassLoader와 동일합니다.Class.forName
과 다릅니다. 기본적으로 Class.forName
은 클래스를 초기화하지 않습니다. 즉, 클래스 로딩의 ClassLoader.loadClass
단계가 실행되지 않으므로 클래스의 정적 코드 블록이 실행되지 않습니다. 初始化
및
을 사용하면 다른 ClassLoader를 지정할 수 있습니다. 예: ClassLoader.loadClass
으아아아
를 호출하면 MyObj의 정적 코드 블록이 실행되지만 Class.forName("com.test.MyObj")
은 실행되지 않습니다.ClassLoader.getSystemClassLoader().loadClass("com.test.MyObj");