앞선 포스트에서
Class.class에 대해 이야기 하였는데
그 내용안에 Class.forName(String className) 메서드가 나옵니다.
이 메서드에 대해서 좀 더 알아보겠습니다. 풍대리님이 static 키워드를 생각해보라고 하신 것이
이 메서드를 말씀하신 거였더라구요..

우선 Class.forName(String className)는
이렇게 구현이 되어 있고 forName0 메서드는 native 메서드입니다.
Class.forName 메서드를 실행하면 해당 클래스 이름을 갖는 클래스가 클래스 로더에 로드 되면서
Class.class의 인스턴스를 리턴합니다. 앞에서도 이야기 하였지만 Class.forName("java.lang.String")을 실행하면
String.class의 명세를 갖는 Class.class의 인스턴스가 리턴되는 것 입니다.

그럼.. Class.forName(String className)을 실행하면 그 클래스에게는 어떤일이 벌어지는가..


위 테스트 클래스를 실행 하면 어떤 결과가 나올까요?
"나 로드 되었네." 라고 출력이 됩니다.
ClassLoader에 의해서 클래스가 적재 되면서 static으로 선언 되어 있는 영역이 실행이 되는 것 입니다.

그럼 아래와 같은 Test는 결과가 어떻게 될까요?

단 한번만 "나 로드 되었네"가 출력됩니다.
한번 클래스로더에 적재 된 이후에는 이미 적재된 클래스를 계속 사용합니다. 일반적으로 클래스로더가 작동하는
방식과 동일합니다.

다음에는 위 내용을 응용한 Service Provider Interface에 대해서 살짝 얘기해 보겠습니다.



Posted by 용식