当前位置: 移动技术网 > IT编程>开发语言>Java > 十分钟速懂java知识点 System类

十分钟速懂java知识点 System类

2019年07月22日  | 移动技术网IT编程  | 我要评论

斑点狗多少钱,2013022,h色漫画

上次面试中遇到的一个问题,问到system.out.println()中的out是不是内部类,当时就给问蒙了,直观感觉out应该是system类的一个属性,跟内部类有什么关系?而且之前整理io部分的时候记得有个printstream的类用于标准输出的,但是从没看过system的源码,也不敢随便再说了。后来看了下源码,发现的确是printstream,可能当时想问的是内部类的用法吧,不过归根结底自己水平差得多,还是要认真学习。
言归正传,system类是jdk提供的一个工具类,有final修饰,不可继承,由名字可以看出来,其中的操作多数和系统相关。其功能主要如下:

  • 标准输入输出,如out、in、err
  • 外部定义的属性和环境变量的访问,如getenv()/setenv()和getproperties()/setproperties()
  • 加载文件和类库的方法,如load()和loadlibrary()、
  • 一个快速拷贝数组的方法:arraycopy()
  • 一些jvm操作,如gc()、runfinalization()、exit(),该部分并未在源码的java doc中提到,可能因为本身不建议主动调用吧。而且这几个方法都仅仅是runtime.getruntime()的调用,两者没有区别

下边直接看图,主要的方法和功能都已经列出来。

下边我们重点来该类是如何初始化的。
首先在开头我们就可以看如下代码:

private static native void registernatives();
static {
  registernatives();
}

类中的静态代码块调用了一个native方法registernatives(),可以猜到该方法应该是一个入口方法,看一下注释:通过静态初始化注册native方法,该方法会令vm通过调用initializesystemclass方法来完成初始化工作。果然如此,那么接下来我们看下initializesystemclass方法吧:

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基本上便讲完了,希望本文所述对大家学习有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网