- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章十分钟速懂java知识点 System类由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
上次面试中遇到的一个问题,问到System.out.println()中的out是不是内部类,当时就给问蒙了,直观感觉out应该是System类的一个属性,跟内部类有什么关系?而且之前整理IO部分的时候记得有个PrintStream的类用于标准输出的,但是从没看过System的源码,也不敢随便再说了。后来看了下源码,发现的确是PrintStream,可能当时想问的是内部类的用法吧,不过归根结底自己水平差得多,还是要认真学习。 言归正传,System类是jdk提供的一个工具类,有final修饰,不可继承,由名字可以看出来,其中的操作多数和系统相关。其功能主要如下:
下边直接看图,主要的方法和功能都已经列出来.
下边我们重点来该类是如何初始化的。 首先在开头我们就可以看如下代码:
1
2
3
4
|
private
static
native
void
registerNatives();
static
{
registerNatives();
}
|
类中的静态代码块调用了一个native方法registerNatives(),可以猜到该方法应该是一个入口方法,看一下注释:通过静态初始化注册native方法,该方法会令vm通过调用initializeSystemClass方法来完成初始化工作。果然如此,那么接下来我们看下initializeSystemClass方法吧:
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
private
static
void
initializeSystemClass() {
// 初始化props
props =
new
Properties();
initProperties(props);
sun.misc.VM.saveAndRemoveProperties(props);
//获取系统相关的换行符
lineSeparator = props.getProperty(
"line.separator"
);
sun.misc.Version.init();
//分别创建in、out、err的实例对象,并通过setXX0()初始化,查看setXX0()方法可知,这是个native方法,将系统的标准流管理到类内的对象
FileInputStream fdIn =
new
FileInputStream(FileDescriptor.in);
FileOutputStream fdOut =
new
FileOutputStream(FileDescriptor.out);
FileOutputStream fdErr =
new
FileOutputStream(FileDescriptor.err);
setIn0(
new
BufferedInputStream(fdIn));
setOut0(
new
PrintStream(
new
BufferedOutputStream(fdOut,
128
),
true
));
setErr0(
new
PrintStream(
new
BufferedOutputStream(fdErr,
128
),
true
));
//加载zip包以获取java.util.zip.ZipFile这个类,以便之后加载利库使用
loadLibrary(
"zip"
);
// 设置平台相关的信号处理
Terminator.setup();
// 初始化sun.misc相关的环境变量
sun.misc.VM.initializeOSEnvironment();
// 主线程不会在同一个线程组中添加相同的线程,我们必须在这里自己实现。注释半天没弄明白,看代码就是主线程自己把自己加到了自己的线程组中......
Thread current = Thread.currentThread();
current.getThreadGroup().add(current);
// 注册共享秘钥?注释没看明白,该方法就是实例化一个JavaLangAccess
setJavaLangAccess();
// 子系统在初始化的时候可以调用sun.misc.VM.isBooted(),以保证在application类加载器启动前不做任何事。booted()其实就是改了个状态,使isBooted()变为true。
sun.misc.VM.booted();
}
|
至此,System基本上便讲完了,希望本文所述对大家学习有所帮助.
最后此篇关于十分钟速懂java知识点 System类的文章就讲到这里了,如果你想了解更多关于十分钟速懂java知识点 System类的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!