我想深入理解Java:内部到底是怎样在运行的呢?
譬如:(下面的代码很常见,调用本地方法,怎样调用的呢?)
private static native void registerNatives();
static {
registerNatives();
}
还有其他的很多类和方法,为什么要那样去定义呢?
我在javaeye、csdn、百度上搜索“怎样读到读懂Java源文件代码”,都没有找到理想的答案。
希望路过此贴的同仁,解疑释惑。
或者提供一些网站、资源或者介绍一些书籍给我,不胜感激!
譬如:(下面的代码很常见,调用本地方法,怎样调用的呢?)
private static native void registerNatives();
static {
registerNatives();
}
还有其他的很多类和方法,为什么要那样去定义呢?
我在javaeye、csdn、百度上搜索“怎样读到读懂Java源文件代码”,都没有找到理想的答案。
希望路过此贴的同仁,解疑释惑。
或者提供一些网站、资源或者介绍一些书籍给我,不胜感激!
2、定义为private表示这是私有方法,一般native方法都定义为private,为了隐藏native接口。当然这没有明确的指导原则。
3、是否定义为static根据你的业务要求而定
4、static程序块就不用讲了,静态块,装载类时就初始化。
只是能大概看懂是什么意思。
private static native void registerNatives();//定义一个本地方法,也就是说这个方法有可能是用C实现的
static {
registerNatives();//在类加载的时候确保调用registerNatives();
}我觉得先从基础来吧。
熟悉掌握理解了java的基础知识再去看源码吧。
在一个模块一个模块的看把
比如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]));
}
这个代码中有注释:只注册跟性能紧密相关的方法(或者说性能关键的方法).
具体的意义可以通过进一步的代码跟踪看出来.
在推荐本《深入java虚拟机》
要读懂源代码,首先需要了解 设计模式 ,Java源代码中应用了很多设计模式。从 lang、util包开始,结合自己编写的程序,了解Java内部实现。
不建议先看 深入Java虚拟机,LZ好像还达不到那个层次, 还是先看 Java语言规范 吧
首先,谢谢诸位的支持!前几天,看spring视频。老师将spring的AOP就是JDK的动态代理技术。然后,就把InvocationHandler、invoke、newProxyInstance,拿来看看。结果,一知半解!于是,就陆续发了两个求知的帖子(前一个很早就结贴了)。都不是很满意,看不太懂。可能就是大家说的,我的等级还不够。这几天,一直没上CSDN,正在淘宝上买书呢!买了一本“Java编程思想(第四版)”,想好好看看。过完年,我就要去深圳找工作了。不知道JAVA工程师要具备什么技能,才好找工作啊?前辈们有什么建议啊!请赐教。