• 欢迎访问金笔头博客,这是一个菜鸟(伪)程序员的自留地,欢迎访问我的github:点击进入

java源码解读系列(一)

java eason 2813次浏览 3个评论 扫描二维码

学java学这么久,老觉得哪里不对劲,总觉得java这么多类,总有种学的力不从心的感觉,因为java本来就不像C语言那样会看到底层的代码,所以对于有兴趣的人士可以看看研究一下,对于开发需求的人就没必要深究了:



从java.lang 包开始,只要解读源码,java也没有多神秘

java源码解读系列(一)

java源码解读系列(一)

 

java.lang是java和核心所在,也是所有几大机制的核心包

我使用的事jdk 8 的版本,上图是sun公司给出的源码截图

共计6个包,117个类文件

 

1、Object.java

在此之前,必须得了解JNI得知识,可以参加我的另一系列(后期推出),JNI
(Java Native InterFace
)即java用来本地编译的代码交互,其实细想一下,java的所有类都是由java虚拟机解释执行,那java虚拟机肯定是调用底层系统的资源了,必然有它的一套调用体系,JNI的思想和这个思想有点类似!
简单介绍一下:

JNI可以这样与本地程序进行交互:

1、你可以使用JNI来实现“本地方法”(native methods),并在JAVA程序中调用它们。

2、JNI支持一个“调用接口”(invocation interface),它允许你把一个JVM嵌入到本地程序中。本地程序可以链接一个实现了JVM的本地库,然后使用“调用接口”执行JAVA语言编写的软件模块。例如,一个用C语言写的浏览器可以在一个嵌入式JVM上面执行从网上下载下来的applets。

(度娘提供,纯属暖贴)

闲话少说:

Object类中的方法:

本地方法:

registerNatives()

getClass()

hashCode()

clone()

notify()

notifyAll()

wait(long timeout)

普通方法:

equals(Object obj)

toString()

wait(long timeout,int nanos)

wait()

finalize()

1、小编对registerNatives()这个方法比较有兴趣,就去查了相关资料

以下代码是此方法的本地声明,本地方法数组声明

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},
};

JNI的代码实现

Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls)
{
(*env)->RegisterNatives(env, cls,
methods, sizeof(methods)/sizeof(methods[0]));
}

这些代码由于小编的c语言也是懂一点皮毛,能知道这个意思,小编认为此段也不用深究。有兴趣的可以去研究OpenJDK

 

2、getClass()方法

java或的运行时字节码文件有三种方式

1.通过 类名.class

2,通过 对象名.getClass()

3,通过Class.forname(“包名.类名”);

 

3、跟线程有关的方法

notify()

notifyAll()

wait(long timeout)

wait(long timeout,int nanos)

wait()

wait()将运行此方法的线程挂起,当然可以设置挂起时间

notify()将挂起状态的线程唤醒

 

4,几个很重要的方法

equals(Object obj)

toString()

要分清 == 与equals()方法的区别

当使用 == 来判断两个变量是否相等时,如果两个变量是基本类型,且都是数值行,值相等,使用==判读返回true,如果是两个引用类型的变量,必须它们指向同一个对象,==才会返回true;equals方法用于判断两个对象是否指向同一对象

public boolean equals(Object obj) {
return (this == obj);
}

toString();

public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}

Object中的toString()方法就是类的完整名+哈希值

 

可以看看java.util.Date 重写的toString()方法

public String toString() {
// “EEE MMM dd HH:mm:ss zzz yyyy”;
BaseCalendar.Date date = normalize();
StringBuilder sb = new StringBuilder(28);
int index = date.getDayOfWeek();
if (index == BaseCalendar.SUNDAY) {
index = 8;
}
convertToAbbr(sb, wtb[index]).append(‘ ‘);                        // EEE
convertToAbbr(sb, wtb[date.getMonth() – 1 + 2 + 7]).append(‘ ‘);  // MMM
CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(‘ ‘); // dd

CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(‘:’);   // HH
CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(‘:’); // mm
CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(‘ ‘); // ss
TimeZone zi = date.getZone();
if (zi != null) {
sb.append(zi.getDisplayName(date.isDaylightTime(), TimeZone.SHORT, Locale.US)); // zzz
} else {
sb.append(“GMT”);
}
sb.append(‘ ‘).append(date.getYear());  // yyyy
return sb.toString();
}

也可以自己重写自己的toString()方法

 

String类的源码解读:

java中要说最重要的一个类,非String莫属了,不管是学习也好,开发也好,开发很多都是在与字符串打交道

看源码能明白封装的好处,String类实际是一个value[]数组封装了一系列的操作,由于String方法太多,文件有3000行,这里只总结一些常用的方法,光是构造方法就将近20个

String a=”abc”;

1.a.length();返回字符串的长度

 

public int length() {
return value.length;
}

就是返回value数组的length属性

 

2.a.chatAt(int index);取指定下标的字符串中的字符

public char charAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
  return value[index];
}

 

3.a.concat(String str);将指定字符串连接到此字符串的结尾

public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
       char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);

return new String(buf, true);
}

 

4.a.indexof(int ch);返回指定字符在此字符串中第一次出现的索引

 

5.a.substring (int beginIndex);返回一个新的字符串,它是此字符串的一个子字符串。该子字符串从指定索引处的字符开始,直到此字符串末尾

 

6.a.substring(int beginIndex,int endIndex);返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定高度beginIndex处开始,直到索引endIndex-1处的字符

 


金笔头博客, 版权所有丨如未注明 , 均为原创, 转载请注明java源码解读系列(一)
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(3)个小伙伴在吐槽
  1. Lh69Fn It`s really a nice and helpful piece of info. I am happy that you just shared this useful info with us. Please keep us up to date like this. Thanks for sharing.
    fiverr backlinks2016-02-04 11:36 Reply Windows XP | Internet Explorer 6.0
  2. I really like and appreciate your article post.Really thank you! Keep writing.
    silvia saint2016-02-03 12:11 Reply 未知操作系统 | Firefox 3.8
  3. :mrgreen: :mrgreen:
    harries2015-11-06 23:21 Reply Windows 7 | Chrome 48.0.2547.0