Maison  >  Article  >  Java  >  Explication détaillée de la classe System en Java

Explication détaillée de la classe System en Java

Y2J
Y2Joriginal
2017-05-04 09:45:262301parcourir

La classe

System est une classe d'outils fournie par jdk. Elle est modifiée avec final et ne peut pas être héritée de . Comme le montre son nom, la plupart des opérations sont. liés au système. Cet article présente principalement l'explication détaillée de la classe Java System_Compilée par la Power Node Java Academy. Les amis dans le besoin peuvent s'y référer

La classe System est une classe d'outils fournie par jdk. Elle a une modification finale et ne peut pas être. hérité. Vous pouvez le voir à partir du nom Sortez, la plupart des opérations sont liées au système. Ses principales fonctions sont les suivantes :

• Entrées et sorties standard, telles que out, in, err

• Accès aux attributs et aux variables d'environnement définis en externe , comme getenv()/setenv() et getProperties()/setProperties()

• Méthodes de chargement de fichiers et de bibliothèques de classes, telles que load() et loadLibrary(),

• Une méthode rapide de copie de tableau : arraycopy()

• Certaines opérations jvm, telles que gc(), runFinalization(), exit(), cette partie n'est pas mentionnée dans la doc java de la source code, peut-être parce que ce n'est pas recommandé. Prenez l'initiative de l'appeler. De plus, ces méthodes ne sont que des appels à Runtime.getRuntime(). Il n'y a pas de différence entre les deux. Regardez directement l'image ci-dessous. Les principales méthodes et fonctions ont été répertoriées.

Ensuite, nous nous concentrons sur la façon dont cette classe est initialisée. Tout d'abord, nous pouvons regarder le code suivant au début : Le bloc de code

static
private static native void registerNatives();
static {
 registerNatives();
}
dans la classe

appelle une méthode native registerNatives(). Vous pouvez le deviner. La méthode doit être une méthode d'entrée. , jetez un œil à l'annotation  : Enregistrez la méthode native via l'initialisation statique, ce qui amènera la machine virtuelle à terminer le travail d'initialisation en appelant la méthode initializeSystemClass. Effectivement, jetons un coup d’œil à la méthode 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();
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn