java中System中的out静态成员是在哪里被初始化的

我翻了下源码,得到下面的结果,不保证一定正确。在System.java中有行静态代码块static { registerNatives();}用来调用registerNatives方法的,在registerNatives方法的注释中提到VM will invoke the initializeSystemClass method to complete the initialization for this class separated from clinit.然后去找initializeSystemClass方法里面调用了setOut0方法,是个本地方法,传入了一个new PrintStream(new BufferedOutputStream(fdOut, 128), true)然后翻看openjdk的System.c的实现,找到了JNIEXPORT void JNICALL Java_java_lang_System_setOut0(JNIEnv *env, jclass cla, jobject stream){ jfieldID fid = (*env)-\u0026gt;GetStaticFieldID(env,cla,"out","Ljava/io/PrintStream;"); if (fid == 0) return; (*env)-\u0026gt;SetStaticObjectField(env,cla,fid,stream);}所以我觉得out对象就是在调用setOut0时传入的new PrintStream(new BufferedOutputStream(fdOut, 128), true)
■网友
参考java System 类里out和err怎么赋值的?没找到源码 initializeSystemClass也没有找到....求大神讲解一下
我也写了一个_out成员:
public static final PrintStream _out = new PrintStream( new BufferedOutputStream(new FileOutputStream(FileDescriptor.out), 128), true);诶,这样这个_out成员就能用了。
public static void main(String args){ _out.println("hhh");} 【java中System中的out静态成员是在哪里被初始化的】

■网友
原来是native层赋值的,具体怎么个写法我也不太清楚.而修饰符final用反射就能修改掉out的值,只是为了方便不让用户随便修改而已


    推荐阅读