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的值,只是为了方便不让用户随便修改而已
推荐阅读
- 鄂温克冬季马赛-30℃极寒开赛:寒冬中的火热派对
- 大雪@大雪腌肉 适当进补 今日大雪
- |电商事业中的“闪光少年”
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- hadoop中的mapreduce链接(mapreduce chaining)怎样避免中间文件的产生
- 经观汽车|日系车企中的“异类”?东风日产将导入e-POWER技术大干增程式混动 | 经观汽车
- 中年|这些东西,比你想象中的还要大得多!
- Java工程师和C++工程师在工作上有啥区别哪个更适合自身发展
- 请问杨毅微博中的这两人是谁
- 某些公司招聘要求中的精通mysql是啥程度
