java - spring ioc中为什么使用classloader,而不是Class.forName
阿神
阿神 2017-04-18 10:51:03
0
1
568
  • spring ioc中为什么使用classloader,而不是Class.forName

  • 这样使用有什么好处?

  • 这两者有什么本质上的区别?

阿神
阿神

闭关修行中......

모든 응답(1)
刘奇

Class.forName과 ClassLoader.loadClass의 차이점

수업 로딩

Class.forNameClassLoader.loadClass의 차이점을 이해하려면 먼저 JVM의 클래스 로딩 단계를 이해해야 합니다.
클래스 로딩은 다음 단계로 나눌 수 있습니다

  • 로드: 정규화된 이름을 통해 클래스의 바이너리 스트림을 얻은 다음 JVM에 로드합니다.

  • 확인: 클래스 파일의 바이트 스트림에 포함된 정보가 가상 머신의 요구 사항을 충족하고 가상 머신의 보안을 위협하지 않는지 확인

  • 준비: 클래스 변수에 대한 메모리 공간을 할당하고 클래스 변수의 초기값을 설정

  • 분석

  • 초기화: 사용자가 지정한 코드에 따라 필드 및 기타 리소스를 초기화하고 정적 블록을 실행합니다.

클래스.이름

지날 때:

으아아아

을 사용하여 클래스를 가져오는 경우 실제로는 Class.forName(className, true, currentLoader)을 호출하는 것과 같습니다. 이 메서드의 두 번째 매개 변수는 클래스를 초기화해야 하는지 여부를 나타냅니다. 따라서 Class.forName을 가져옵니다. 클래스 객체는 자동으로 초기화됩니다.true그리고 Class.forName이 로드한 클래스의 ClassLoader는
이 호출된 클래스의 ClassLoader와 동일합니다.Class.forName

ClassLoader.loadClass

과 다릅니다. 기본적으로 Class.forName은 클래스를 초기화하지 않습니다. 즉, 클래스 로딩의 ClassLoader.loadClass 단계가 실행되지 않으므로 클래스의 정적 코드 블록이 실행되지 않습니다. 初始化
을 사용하면 다른 ClassLoader를 지정할 수 있습니다. 예: ClassLoader.loadClass 으아아아

으아아아 으아아아

위 코드에서

를 호출하면 MyObj의 정적 코드 블록이 실행되지만 Class.forName("com.test.MyObj")은 실행되지 않습니다.ClassLoader.getSystemClassLoader().loadClass("com.test.MyObj");

이렇게 사용하면 어떤 이점이 있나요?

개인적인 추측으로는 Spring IoC의 지연 로딩과 관련이 있을 것으로 보입니다. Spring IoC는 클래스 로더를 사용하면 클래스에서 초기화 코드를 실행할 필요가 없기 때문에 지연 로딩 기술을 많이 사용합니다. 이는 로딩 속도를 높일 수 있습니다. 클래스의 초기화 작업은 클래스가 실제로 사용될 때까지 남아 있습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿