Java-System 시스템 클래스에 대한 심층 분석
Tiantian이 출력에 System.out.println을 사용한다고 해서 궁금한 점이 있습니다. out이 변수인가요, 아니면 내부 클래스인가요? 방대하고 체계적인 지식이 다양한 주제로 자세하게 설명되어 있는데, 이렇게 산재해 있는 지식 포인트를 무시할 수는 없고, 그렇지 않으면 면접에서 이렇게 간단한 질문을 받고 대답하지 못한다면 매우 당황스러울 것입니다.
인스턴스화할 수 없는 시스템 클래스
시스템 클래스로서 JDK의 java.lang 패키지에서도 시스템 클래스임을 알 수 있습니다. 자바 특성의 핵심 언어. System 클래스의 생성자는 private으로 장식되어 있으며 인스턴스화할 수 없습니다. 따라서 클래스의 메서드도 정적 수정된 정적 메서드입니다.
필드
public final static InputStream in; //标准输入流 public final static PrintStream out; //标准输出流 public final static PrintStream err; //标准错误流
out과 in System은 내부 클래스가 아니고 진짜 필드 변수임을 알 수 있다. out은 PrintStream의 최종 static에 의해 수정된 변수 필드입니다. 이는 PrintStream 클래스의 메서드를 호출할 수 있음을 의미합니다. Println은 PrintStream의 출력 방법이므로 일반적으로 System.out.println()을 사용하여 콘솔에 내용을 출력합니다.
시스템에서 자주 사용하는 메소드
arraycopy—— ArrayCopy
public static void main(String[] args) { int[] arr1 = { 0, 1, 2, 3, 4 }; int[] arr2 = { 9, 9, 9, 9, 9 }; System.arraycopy(arr1, 2, arr2, 0, 3); arr1[3] = 8; for (int i = 0; i < 5; i++) System.out.print(arr2[i] + " "); //2 3 4 9 9 }
arraycopy 메소드에는 복사할 배열, 복사할 시작 위치, 복사할 배열, 배열의 시작 위치 등 5개의 매개변수가 있습니다. 복사할 수 있고 이 배열의 끝에 복사할 수 있습니다. 이 메서드는 Arrays의 copyOf 및 copyOfRange와 유사하며 더 많은 매개변수가 있으며 필요한 경우 사용할 수 있습니다.
currentTimeMillis——밀리초 수를 반환합니다
이것은 예제가 아닙니다. 의 currentTimeMillis 메소드와 getTime 메소드는 Date 클래스 똑같습니다. 밀리초만 필요한 경우에도 이러한 호출이 매우 편리합니다. 그러나 currentTimeMillis는 getTime의 결과를 직접 가져오지 않는다는 점에 유의해야 합니다. currentTimeMillis는 운영 체제의 시간을 반환하는 로컬 메서드이므로 일부 운영 체제 시간의 최소 정확도는 10밀리초이므로 이 메서드는 약간의 편차를 일으킬 수 있습니다. .
getProperty——시스템 속성 가져오기
이 메소드를 호출하고 매개변수에 키의 <🎜를 입력합니다. >String시스템의 속성을 가져옵니다.
键 | 相关值的描述 |
---|---|
java.version | Java 运行时环境版本 |
java.vendor | Java运行时环境供应商 |
java.vendor.url | Java 供应商的 URL |
java.home | Java 安装目录 |
java.vm.specification.version | Java 虚拟机规范版本 |
java.vm.specification.vendor | Java 虚拟机规范供应商 |
java.vm.specification.name | Java 虚拟机规范名称 |
java.vm.version | Java 虚拟机实现版本 |
java.vm.vendor | Java 虚拟机实现供应商 |
java.vm.name | Java 虚拟机实现名称 |
java.specification.version | Java 运行时环境规范版本 |
java.specification.vendor | Java 运行时环境规范供应商 |
java.specification.name | Java 运行时环境规范名称 |
java.class.version | Java 类格式版本号 |
java.class.path | Java 类路径 |
java.library.path | 加载库时搜索的路径列表 |
java.io.tmpdir | 默认的临时文件路径 |
java.compiler | 要使用的 JIT 编译器的名称 |
java.ext.dirs | 一个或多个扩展目录的路径 |
os.name | 操作系统的名称 |
os.arch | 操作系统的架构 |
os.version | 操作系统的版本 |
file.separator | 文件分隔符(在 UNIX 系统中是“/”) |
path.separator | 路径分隔符(在 UNIX 系统中是“:”) |
line.separator | 行分隔符(在 UNIX 系统中是“/n”) |
user.name | 用户的账户名称 |
user.home | 用户的主目录 |
user.dir | 用户的当前工作目录 |
在我们操作文件的时候很可能需要使用到我们的当前工作目录,可以用这个方法来获得。
public static void main(String[] args) { String dirPath = System.getProperty("user.dir"); System.out.println(dirPath); //输出工作目录 D:\Workspaces\MyEclipse 10\Algorithms(这是我的目录,每个人都不同) }
上面的表中就不再举例了,比较常用的是后几个key。
gc——运行垃圾回收器
调用 gc 方法暗示着 Java 虚拟机做了一些努力来回收未用对象或失去了所有引用的对象,以便能够快速地重用这些对象当前占用的内存。当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间。
public static void main(String[] args) { Date d = new Date(); d = null; System.gc(); // 在调用这句gc方法时,上面已经失去了d引用的new Date()被回收 }
实际上我们并不一定需要调用gc()方法,让编译器自己去做好了。如果调用gc方法,会在对象被回收之前调用finalize()方法,但是我们也知道finalize()方法不一定会被调用。总之java在这回收方面做的远不如c和c++。我们可以规避有关回收方面的问题。当需要了解的时候最好专门的去看JVM回收机制的文章。
exit——退出虚拟机
exit(int)方法终止当前正在运行的 Java 虚拟机,参数解释为状态码。根据惯例,非 0 的状态码表示异常终止。 而且,该方法永远不会正常返回。 这是唯一一个能够退出程序并不执行finally的情况。
public static void main(String[] args) { try { System.out.println("this is try"); System.exit(0); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { System.out.println("this is finally"); } }
这段程序最后只会输出 this is try 这一句话,而不会输出 this is finally 。退出虚拟机会直接杀死整个程序,已经不是从代码的层面来终止程序了,所以finally不会执行。
深度剖析System类源代码
看完了表面的方法,我们来继续学习一下System的源代码。还是老样子,找个jdk包打开rt.jar找到java.lang.System类。
初始化
首先映入眼帘的就是一个静态块:
/* register the natives via the static initializer. * * VM will invoke the initializeSystemClass method to complete * the initialization for this class separated from clinit. * Note that to use properties set by the VM, see the constraints * described in the initializeSystemClass method. */ private static native void registerNatives(); static { registerNatives(); }
native不用看了,本机方法。这是可以猜得到的,因为System类要使用输入和输出流可能会用到和操作系统相关的一些本机方法。那么在static块中调用了registerNatives()方法,这个方法是本地方法我们看不到具体实现。但是注释说了:“VM will invoke the initializeSystemClass method to complete the initialization for this class separated from clinit”。
那么JVM调用的initializeSystemClass方法是怎么实现的呢?
private static void initializeSystemClass() { props = new Properties(); initProperties(props); sun.misc.VM.saveAndRemoveProperties(props); lineSeparator = props.getProperty("line.separator"); sun.misc.Version.init(); FileInputStream fdIn = new FileInputStream(FileDescriptor.in); FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out); FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err); setIn0(new BufferedInputStream(fdIn)); setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding"))); setErr0(newPrintStream(fdErr, props.getProperty("sun.stderr.encoding"))); loadLibrary("zip"); Terminator.setup(); sun.misc.VM.initializeOSEnvironment(); Thread current = Thread.currentThread(); current.getThreadGroup().add(current); setJavaLangAccess(); sun.misc.VM.booted(); }
这个方法就在System类中,但是我们刚才没有介绍,因为是private的方法,只是用来自己做注册使用。我整理了一下源代码去掉了无用的部分。这个方法的大概意思是说:1.初始化Properties 2.初始化输入、输出、错误流 3.进行一大堆配置。
设置输入/输出/错误流
可以注意其中的几行,setIn0,setOut0,setErr0这三个方法。这三个方法是System中public方法setIn,setOut,setErr内部调用的子方法。我们用这几个方法来设置这三个流。
public static void setIn(InputStream in) { checkIO(); setIn0(in); }
比如这是setIn方法,我们使用这个方法来设置输入流(此方法被使用的频率不是很高)。checkIO是检查IO流是否正确,setIn0是native方法,做真正的输入流替换工作。
private static native void setIn0(InputStream in);
위 내용은 Java-System 시스템 클래스에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java 문서 해석: System 클래스의 currentTimeMillis() 메소드에 대한 사용 분석, 특정 코드 예제가 필요합니다. Java 프로그래밍에서 System 클래스는 시스템과 관련된 일부 속성과 작업을 캡슐화하는 매우 중요한 클래스입니다. 그 중 currentTimeMillis 메소드는 System 클래스에서 매우 일반적으로 사용되는 메소드입니다. 이 기사에서는 메소드에 대해 자세히 설명하고 코드 예제를 제공합니다. 1. currentTimeMillis 메소드 개요

win10 시스템은 매우 사용하기 쉽고 지능적인 시스템입니다. 강력한 호환성으로 인해 시스템은 기본적으로 정상적인 사용 중에 문제가 발생하지 않습니다. 그러나 사람들이 win10 시스템을 계속 사용함에 따라 때때로 시스템에 문제가 발생할 수도 있습니다. 문제가 있습니다. Win10 부팅 블루 스크린 종료 코드 SystemServiceException 문제가 있습니다. 오늘 편집자가 Win10 부팅 블루 스크린 종료 코드 SystemServiceException에 대한 솔루션을 제공할 것입니다. 필요한 경우 빨리 다운로드하십시오. win10systemserviceException 블루 스크린 해결 방법: 방법 1: 1. Windows 키 + R을 사용하여 실행을 열고 "contr"을 입력합니다.

컴퓨터 시스템은 비교적 일반적인 시스템 프로세스입니다. 프로세스를 볼 때 시스템이 자주 표시됩니다. 이 프로세스는 단순히 컴퓨터 시스템을 의미하지만, system.exe 프로세스가 컴퓨터에 나타나는 경우에는 삭제해야 합니다. 이것은 트로이 목마 바이러스에 의해 생성된 파일입니다. 실제 시스템 뒤에는 exe 접미사가 없습니다.

Windows 7 영어 버전 시스템에 대해 들어보신 적이 있으신가요? 그러나 일부 친구들은 Windows 7 영어 버전 시스템에 대해 들어본 적이 있을 것입니다. 오늘은 네티즌들이 영어로 된 win7의 원본 버전을 이해할 수 있도록 편집자가 영어로 된 win7의 원본 버전에 대한 소개를 모든 사람과 공유할 예정입니다. 다음은 Windows 7 시스템의 영어 버전을 다운로드할 수 있는 위치를 알려드립니다. win7의 원본 영어 시스템이 구독 다운로드를 위해 MSDN에 출시되었습니다. 공식 영어 통합 버전인 Windows7WithSP1이 처음 출시되었습니다. 이는 통합 SP1이 포함된 Windows7 CD 이미지입니다. 여러 언어에 대한 SP1 독립 실행형 포함

Object는 모든 Java 클래스의 기본 클래스이자 전체 클래스 상속 구조의 최상위 클래스이자 가장 추상적인 클래스입니다. 누구나 toString(), equals(), hashCode(), wait(), inform(), getClass() 및 기타 메소드를 매일 사용합니다. 아마도 그들은 Object의 메소드라는 것을 인식하지 못하고 보지도 않을 것입니다. Object에는 또 어떤 메소드가 있는지 그리고 왜 이러한 메소드를 Object에 배치해야 하는지 생각해 보세요. 1. JavaObject 클래스 소개 - 모든 클래스의 슈퍼 클래스 Object는 Java 클래스 라이브러리의 특수 클래스이자 모든 클래스의 상위 클래스이기도 합니다. 즉, Java에서는 모든 유형의 객체를 객체 유형에 할당할 수 있습니다.

Microsoft는 System Center 2022의 출시를 발표했습니다. 최신 버전에는 SCOM(System Center Operations Manager), VMM(Virtual Machine Manager), SCORCH(System Center Orchestrator), SM(Service Manager) 및 Data Protection Manager가 포함되어 있습니다.

1990년대 Macintosh로 돌아가 브라우저 창에서 System 7 및 MacOS 8의 완전한 가상 설치를 실행해 보세요. 1990년대 Mac 소프트웨어의 새로운 가상 버전의 한 가지 결점은 2020년대 Mac의 속도로 실행된다는 것입니다. MacSE/30이나 Quadra700을 보고 계시지만 모든 것이 Apple Silicon만큼 빠릅니다. 실제로 이러한 시뮬레이션된 운영 체제에서 작업할 수 있으며 macOS Monterey 안팎으로 문서나 파일을 드래그할 수도 있습니다. 그러나 실용적인 목적이든 순수한 재미를 위한 것이든 다음 방법을 따르세요.

1. 시스템 클래스로서의 System 소개 JDK의 java.lang 패키지에서도 Java의 핵심 언어 기능임을 알 수 있습니다. System 클래스의 생성자는 private으로 장식되어 있으며 인스턴스화할 수 없습니다. 따라서 클래스의 메서드도 static으로 수정된 정적 메서드입니다. JAVA의 Arrays 클래스는 배열 작업을 구현하는 도구 클래스입니다. 여기에는 배열 정렬 및 검색, 배열 비교, 배열에 요소 추가, 배열 복사 및 배열을 문자열 함수로 변환할 수 있는 다양한 정적 메서드가 포함되어 있습니다. 이러한 메서드에는 모든 기본 유형에 대한 오버로드된 메서드가 있습니다. 2. 지식 포인트에 대한 자세한 설명 1. API의 System 클래스에서 개념을 비교적 간단하게 정의합니다.
