我想深入理解Java:内部到底是怎样在运行的呢?
譬如:(下面的代码很常见,调用本地方法,怎样调用的呢?)
    private static native void registerNatives();
    static {
        registerNatives();
    }
还有其他的很多类和方法,为什么要那样去定义呢?
我在javaeye、csdn、百度上搜索“怎样读到读懂Java源文件代码”,都没有找到理想的答案。
希望路过此贴的同仁,解疑释惑。
或者提供一些网站、资源或者介绍一些书籍给我,不胜感激!

解决方案 »

  1.   

     java的底层代码,都封装在jdk中,有个src压缩包,里面都是底层代码,他们之间是相互联系的,逻辑性超强,你可以先从最基本的string类,开始看,慢慢深入就应该可以弄懂
      

  2.   

    1、定义成native表示这是一个本地方法,是和系统相关的实现
    2、定义为private表示这是私有方法,一般native方法都定义为private,为了隐藏native接口。当然这没有明确的指导原则。
    3、是否定义为static根据你的业务要求而定
    4、static程序块就不用讲了,静态块,装载类时就初始化。
      

  3.   

    我看不太懂那些源码。
    只是能大概看懂是什么意思。
        private static native void registerNatives();//定义一个本地方法,也就是说这个方法有可能是用C实现的
        static {
            registerNatives();//在类加载的时候确保调用registerNatives();
        }我觉得先从基础来吧。
    熟悉掌握理解了java的基础知识再去看源码吧。
      

  4.   

    熟悉掌握理解了java的基础知识
    在一个模块一个模块的看把
      

  5.   

    读源代码不外两种方式,一种是按照执行的顺序,即从main方法开始,按照调用的次序依次分析;一种是按照类的方式单独分析。看java自身类库的代码一般对一个类进行直接分析即可。对于Object类,因为大部分方法是native方法,不容易直接跟踪,所以理解api文档中对这些方法的说明就可以了。如果有兴趣,可以自己下一个openjdk的代码来分析,从这个地方可以下载http://openjdk.java.net/
    比如Object类的代码在openjdk\jdk\src\share\native\java\lang\Object.c中,你可以直接分析c语言代码。
    registerNatives();这个方法是用来注册native方法的,它的作用是向JNIEnv注册本来中的其他native方法(注意不是所有的)。
    比如Object.c的代码如下:#include <stdio.h>
    #include <signal.h>
    #include <limits.h>#include "jni.h"
    #include "jni_util.h"
    #include "jvm.h"#include "java_lang_Object.h"static JNINativeMethod methods[] = {
        {"hashCode",    "()I",                    (void *)&JVM_IHashCode},
        {"wait",        "(J)V",                   (void *)&JVM_MonitorWait},
        {"notify",      "()V",                    (void *)&JVM_MonitorNotify},
        {"notifyAll",   "()V",                    (void *)&JVM_MonitorNotifyAll},
        {"clone",       "()Ljava/lang/Object;",   (void *)&JVM_Clone},
    };JNIEXPORT void JNICALL
    Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls)
    {
        (*env)->RegisterNatives(env, cls,
                                methods, sizeof(methods)/sizeof(methods[0]));
    }JNIEXPORT jclass JNICALL
    Java_java_lang_Object_getClass(JNIEnv *env, jobject this)
    {
        if (this == NULL) {
            JNU_ThrowNullPointerException(env, NULL);
            return 0;
        } else {
            return (*env)->GetObjectClass(env, this);
        }
    从里面可以看到registerNatives注册的方法是hashCode,notify,wait,notifyAll,clone等5个方法。类似的registerNatives在其他类中也可以看到,比如System类中.public final class System {    /* First thing---register the natives */
        private static native void registerNatives();
        static {
            registerNatives();
        }它对应的是c代码是/* Only register the performance-critical methods */
    static JNINativeMethod methods[] = {
        {"currentTimeMillis", "()J",              (void *)&JVM_CurrentTimeMillis},
        {"nanoTime",          "()J",              (void *)&JVM_NanoTime},
        {"arraycopy",     "(" OBJ "I" OBJ "II)V", (void *)&JVM_ArrayCopy},
    };#undef OBJJNIEXPORT void JNICALL
    Java_java_lang_System_registerNatives(JNIEnv *env, jclass cls)
    {
        (*env)->RegisterNatives(env, cls,
                                methods, sizeof(methods)/sizeof(methods[0]));
    }
    这个代码中有注释:只注册跟性能紧密相关的方法(或者说性能关键的方法).
    具体的意义可以通过进一步的代码跟踪看出来.
      

  6.   

    谢谢大家的回复,特别是7楼的ZangXT,可惜看不懂啊。
      

  7.   

    同意
    在推荐本《深入java虚拟机》
      

  8.   


    要读懂源代码,首先需要了解 设计模式 ,Java源代码中应用了很多设计模式。从 lang、util包开始,结合自己编写的程序,了解Java内部实现。
    不建议先看 深入Java虚拟机,LZ好像还达不到那个层次, 还是先看 Java语言规范 吧
      

  9.   


    首先,谢谢诸位的支持!前几天,看spring视频。老师将spring的AOP就是JDK的动态代理技术。然后,就把InvocationHandler、invoke、newProxyInstance,拿来看看。结果,一知半解!于是,就陆续发了两个求知的帖子(前一个很早就结贴了)。都不是很满意,看不太懂。可能就是大家说的,我的等级还不够。这几天,一直没上CSDN,正在淘宝上买书呢!买了一本“Java编程思想(第四版)”,想好好看看。过完年,我就要去深圳找工作了。不知道JAVA工程师要具备什么技能,才好找工作啊?前辈们有什么建议啊!请赐教。