天蓬老师2017-04-18 10:56:47
우선 System.in은 소스 코드에서 다음과 같이 입력스트림 유형의 개체입니다.
으아악System.in은 표준입력에 속하며 키보드나 다른 방법을 통해서도 데이터를 입력할 수 있음을 알 수 있다.
그러나 소스 코드에서 이 객체에는 (명시적인) 초기화 방법이 없습니다. 소스 코드를 읽으면 다음 방법을 찾을 수 있습니다.
댓글을 읽어보면 이 메소드가 설정에 사용된다는 것을 알 수 있습니다.
setIn0(in)을 연구하면 이 메소드가 기본 인터페이스를 호출하여 in의 설정을 구현한다는 것을 알 수 있습니다. 그러면 소프트웨어가 초기화될 때 어떻게 초기화됩니까? 달리기?
System 클래스에는 다음 코드가 있습니다.
이 코드에서 볼 수 있듯이 소프트웨어는 실행 중일 때 먼저 정적 코드 블록을 실행하고 기본 메서드인 RegisterNatives()를 호출하여 System 클래스를 초기화합니다. 이 메서드는 초기화SystemClass() 메서드를 호출하여 시스템을 초기화합니다. 이 두 단계는 모두 VM을 통해 구현된 다음 초기화SystemClass() 메서드를 읽어보면 표준 입력, 표준 출력, 그리고 각각 표준 오류입니다. 이 시점에서 System.in, out, err의 초기화 프로세스가 모두 명확해졌습니다.
네이티브로 표시된 메소드는 JVM이 다른 코드를 호출하여 구현한 함수입니다. 이는 하위 레이어와 관련이 있습니다. 실제로는 Bootstrap 클래스로더가 C로 구현된 것처럼 느껴지지만 JVM에서 호출됩니다. 각 기본 JAR 클래스를 로드하는 방법은 비슷합니다.
추가적으로, InputStream이 추상 클래스(인터페이스)라고 말씀하셨는데, 실제로 인터페이스 클래스와 추상 클래스를 매개변수로 사용할 수는 있지만 구현은 당연히 구현할 수는 없지만, 구현은 할 수 있습니다. 결국 자식 클래스를 교체할 수 있는 곳에 부모 클래스가 나타나므로 여기서는 문제가 없습니다