java.lang.System
System类包含几个有用的类字段和方法。 它不能被实例化。
System类提供的System包括标准输入,标准输出和错误输出流; 访问外部定义的属性和环境变量; 一种加载文件和库的方法; 以及用于快速复制阵列的一部分的实用方法。
public final static PrintStream err = null;//“标准”错误输出流。
public final static InputStream in = null;//“标准”输入流。
public final static PrintStream out = null;//“标准”输出流。
/* * 版权所有(c)1994,2013,Oracle和/或其附属公司。 版权所有。 ORACLE专有/保密。 使用受制于许可条款。 */ package java.lang; import java.io.*; import java.lang.reflect.Executable; import java.lang.annotation.Annotation; import java.security.AccessControlContext; import java.util.Properties; import java.util.PropertyPermission; import java.util.StringTokenizer; import java.util.Map; import java.security.AccessController; import java.security.PrivilegedAction; import java.security.AllPermission; import java.nio.channels.Channel; import java.nio.channels.spi.SelectorProvider; import sun.nio.ch.Interruptible; import sun.reflect.CallerSensitive; import sun.reflect.Reflection; import sun.security.util.SecurityConstants; import sun.reflect.annotation.AnnotationType; /** * 系统类包含几个有用的类字段和方法。它不能被实例化。 */ public final class System { /* * 通过静态初始化器注册本机。 * VM将调用initializeSystemClass方法来完成这个与clinit分离的类的初始化。注意,要使用VM设置的属性,请参阅initializeSystemClass方法中描述的约束。 */ private static native void registerNatives(); static { registerNatives(); } /** 不要让任何人实例化这个类 */ private System() { } /** * “标准”输入流。 */ public final static InputStream in = null; /** * “标准”输出流。 */ public final static PrintStream out = null; /** * “标准”错误输出流。 */ public final static PrintStream err = null; /* 系统的安全管理器。 */ private static volatile SecurityManager security = null; /** * 重新分配“标准”输入流。 */ public static void setIn(InputStream in) { checkIO(); setIn0(in); } /** * 重新分配“标准”输出流。 */ public static void setOut(PrintStream out) { checkIO(); setOut0(out); } /** * 重新分配“标准”错误输出流。 */ public static void setErr(PrintStream err) { checkIO(); setErr0(err); } private static volatile Console cons = null; /** * 返回与当前Java虚拟机关联的唯一的Console对象(如果有)。 */ public static Console console() { if (cons == null) { synchronized (System.class) { cons = sun.misc.SharedSecrets.getJavaIOAccess().console(); } } return cons; } /** * 返回从创建此Java虚拟机的实体继承的通道。 */ public static Channel inheritedChannel() throws IOException { return SelectorProvider.provider().inheritedChannel(); } private static void checkIO() { SecurityManager sm = getSecurityManager(); if (sm != null) { sm.checkPermission(new RuntimePermission("setIO")); } } private static native void setIn0(InputStream in); private static native void setOut0(PrintStream out); private static native void setErr0(PrintStream err); /** * 设置系统安全性。 */ public static void setSecurityManager(final SecurityManager s) { try { s.checkPackageAccess("java.lang"); } catch (Exception e) { // no-op } setSecurityManager0(s); } private static synchronized void setSecurityManager0(final SecurityManager s) { SecurityManager sm = getSecurityManager(); if (sm != null) { // ask the currently installed security manager if we // can replace it. sm.checkPermission(new RuntimePermission("setSecurityManager")); } if ((s != null) && (s.getClass().getClassLoader() != null)) { // New security manager class is not on bootstrap classpath. // Cause policy to get initialized before we install the new // security manager, in order to prevent infinite loops when // trying to initialize the policy (which usually involves // accessing some security and/or system properties, which in turn // calls the installed security manager's checkPermission method // which will loop infinitely if there is a non-system class // (in this case: the new security manager class) on the stack). AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { s.getClass().getProtectionDomain().implies (SecurityConstants.ALL_PERMISSION); return null; } }); } security = s; } /** * 获取系统安全界面。 */ public static SecurityManager getSecurityManager() { return security; } /** * 返回当前时间(以毫秒为单位)。 */ public static native long currentTimeMillis(); /** * 以纳秒为单位返回正在运行的Java虚拟机的高分辨率时间源的当前值。 */ public static native long nanoTime(); /** * 将指定源数组中的数组从指定位置复制到目标数组的指定位置。 */ public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length); /** * 返回与默认方法hashCode()返回的给定对象相同的哈希码,无论给定对象的类是否覆盖了hashCode()。 */ public static native int identityHashCode(Object x); /** * 系统属性。下面的属性保证被定义: */ private static Properties props; private static native Properties initProperties(Properties props); /** * 确定当前的系统属性。 */ public static Properties getProperties() { SecurityManager sm = getSecurityManager(); if (sm != null) { sm.checkPropertiesAccess(); } return props; } /** * 返回与系统相关的行分隔符字符串。 */ public static String lineSeparator() { return lineSeparator; } private static String lineSeparator; /** * 将系统属性设置为 Properties参数。 */ public static void setProperties(Properties props) { SecurityManager sm = getSecurityManager(); if (sm != null) { sm.checkPropertiesAccess(); } if (props == null) { props = new Properties(); initProperties(props); } System.props = props; } /** * 获取指定键指示的系统属性。 */ public static String getProperty(String key) { checkKey(key); SecurityManager sm = getSecurityManager(); if (sm != null) { sm.checkPropertyAccess(key); } return props.getProperty(key); } /** * 获取指定键指示的系统属性。 */ public static String getProperty(String key, String def) { checkKey(key); SecurityManager sm = getSecurityManager(); if (sm != null) { sm.checkPropertyAccess(key); } return props.getProperty(key, def); } /** * 设置由指定键指示的系统属性。 */ public static String setProperty(String key, String value) { checkKey(key); SecurityManager sm = getSecurityManager(); if (sm != null) { sm.checkPermission(new PropertyPermission(key, SecurityConstants.PROPERTY_WRITE_ACTION)); } return (String) props.setProperty(key, value); } /** * 删除指定键指定的系统属性。 */ public static String clearProperty(String key) { checkKey(key); SecurityManager sm = getSecurityManager(); if (sm != null) { sm.checkPermission(new PropertyPermission(key, "write")); } return (String) props.remove(key); } private static void checkKey(String key) { if (key == null) { throw new NullPointerException("key can't be null"); } if (key.equals("")) { throw new IllegalArgumentException("key can't be empty"); } } /** * 获取指定环境变量的值。 */ public static String getenv(String name) { SecurityManager sm = getSecurityManager(); if (sm != null) { sm.checkPermission(new RuntimePermission("getenv."+name)); } return ProcessEnvironment.getenv(name); } /** * 返回当前系统环境的不可修改的字符串映射视图。 */ public static java.util.Map<String,String> getenv() { SecurityManager sm = getSecurityManager(); if (sm != null) { sm.checkPermission(new RuntimePermission("getenv.*")); } return ProcessEnvironment.getenv(); } /** * 终止当前运行的Java虚拟机。 */ public static void exit(int status) { Runtime.getRuntime().exit(status); } /** * 运行垃圾回收器。 */ public static void gc() { Runtime.getRuntime().gc(); } /** * 运行任何对象等待定稿的最终化方法。 */ public static void runFinalization() { Runtime.getRuntime().runFinalization(); } /** * 已弃用 * 这种方法本质上是不安全的。 它可能导致在活动对象上调用finalizer,而其他线程同时操作这些对象,导致不稳定的行为或死锁。 */ @Deprecated public static void runFinalizersOnExit(boolean value) { Runtime.runFinalizersOnExit(value); } /** * 加载由filename参数指定的本机库。 */ @CallerSensitive public static void load(String filename) { Runtime.getRuntime().load0(Reflection.getCallerClass(), filename); } /** * 加载 libname参数指定的本机库。 */ @CallerSensitive public static void loadLibrary(String libname) { Runtime.getRuntime().loadLibrary0(Reflection.getCallerClass(), libname); } /** * 将库名称映射到表示本地库的平台特定字符串。 */ public static native String mapLibraryName(String libname); /** * 为stdout/err创建基于编码的PrintStream。 */ private static PrintStream newPrintStream(FileOutputStream fos, String enc) { if (enc != null) { try { return new PrintStream(new BufferedOutputStream(fos, 128), true, enc); } catch (UnsupportedEncodingException uee) {} } return new PrintStream(new BufferedOutputStream(fos, 128), true); } /** * 初始化系统类。之后调用线程初始化。 */ private static void initializeSystemClass() { /** * VM可能会调用JNU_NewStringPlatform()来在“props”初始化期间设置那些编码敏感属性 * (user.home,user.name,boot.class.path等),在此过程中可能需要通过 * System.getProperty() 到在初始化初期初始化(放入“道具”)的相关系统编码属性。 * 因此,确保“props”在初始化开始时可用,并且所有系统属性都可直接加入。 */ props = new Properties(); initProperties(props); // 由VM初始化 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"))); // 现在加载zip库,以防止java.util.zip.ZipFile尝试使用它自己来稍后加载该库。 loadLibrary("zip"); // 为HUP、TERM和INT(如有)设置Java信号处理程序。 Terminator.setup(); /** * 初始化需要为类库设置的任何不正常的操作系统设置。 * 目前,除了在使用java.io类之前设置进程范围错误模式的Windows之外,这是无处不在的。 */ sun.misc.VM.initializeOSEnvironment(); // 主线程不像其他线程那样添加到它的线程组中;我们必须自己做这件事。 Thread current = Thread.currentThread(); current.getThreadGroup().add(current); // 注册共享秘密 setJavaLangAccess(); /** * 在初始化过程中调用的子系统可以调用sun.misc.VM.isBooted(), * 以避免在应用程序类加载器设置完成之前进行操作。 重要提示:确保这仍然是最后的初始化操作! */ sun.misc.VM.booted(); } private static void setJavaLangAccess() { // 允许java.lang之外的特权类 sun.misc.SharedSecrets.setJavaLangAccess(new sun.misc.JavaLangAccess(){ public sun.reflect.ConstantPool getConstantPool(Class<?> klass) { return klass.getConstantPool(); } public boolean casAnnotationType(Class<?> klass, AnnotationType oldType, AnnotationType newType) { return klass.casAnnotationType(oldType, newType); } public AnnotationType getAnnotationType(Class<?> klass) { return klass.getAnnotationType(); } public Map<Class<? extends Annotation>, Annotation> getDeclaredAnnotationMap(Class<?> klass) { return klass.getDeclaredAnnotationMap(); } public byte[] getRawClassAnnotations(Class<?> klass) { return klass.getRawAnnotations(); } public byte[] getRawClassTypeAnnotations(Class<?> klass) { return klass.getRawTypeAnnotations(); } public byte[] getRawExecutableTypeAnnotations(Executable executable) { return Class.getExecutableTypeAnnotationBytes(executable); } public <E extends Enum<E>> E[] getEnumConstantsShared(Class<E> klass) { return klass.getEnumConstantsShared(); } public void blockedOn(Thread t, Interruptible b) { t.blockedOn(b); } public void registerShutdownHook(int slot, boolean registerShutdownInProgress, Runnable hook) { Shutdown.add(slot, registerShutdownInProgress, hook); } public int getStackTraceDepth(Throwable t) { return t.getStackTraceDepth(); } public StackTraceElement getStackTraceElement(Throwable t, int i) { return t.getStackTraceElement(i); } public String newStringUnsafe(char[] chars) { return new String(chars, true); } public Thread newThreadWithAcc(Runnable target, AccessControlContext acc) { return new Thread(target, acc); } public void invokeFinalize(Object o) throws Throwable { o.finalize(); } }); } }
文章来源: System 源码