博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java.lang.Object底层代码分析-jdk1.8
阅读量:6992 次
发布时间:2019-06-27

本文共 4994 字,大约阅读时间需要 16 分钟。

首先先来说明两件事情

1、后面的一些博客都会对jdk底层的方法进行一些分析,因为我个人开发了2年多,发现有很多事情还不是清楚,当我今天再好好底层源码的时候还是有不少的收获,所以和大家分     享一下,我只要参考一下相关文档

     jdk1.8api:https://docs.oracle.com/javase/8/docs/api/index.html

     代码下载地址:https://gitee.com/luanmihun/java-jdk-study

2、为什么要分析jdk1.8的版本,只是一些个人的分析,还望理解,如果说的不对麻烦您再评论中给我提出修改意见我会及时修改?

     主要的原因在我看来,现在很多公司都在采用springboot进行开发,因为他的自动装配还是很好用的,springboot1.x的版本支持jdk1.7和1.8,而到了springboot2.x版本已经支持    到 了jdk1.9(目前最新版本是10版本,java SE 9已达到支持结束。Java SE 9的用户应该切换到Java SE 10这是官方给出的说明),springboot2.x版本也是支持jdk1.8的所以这里   面我们选择jdk1.8的底层进行说明,其实不管理解了那个版本的底层,最后你只要查看每次更新的新特性还是能很快就跟上脚步的。

现在开始代码的分析

我已在代码里面写了相关注释,所以大家之后的相关分析直接看注释就可以了,源码可以直接在git上面进行下载

我们分析的底层源码全部是在rt.jar里面。

下面的内容就是java.lang.Object类里面的所有方法

 

package java.lang;/** * @Auther: luanmihun * @Date: 2018/7/30 17:02 * @Description:java.lang包下面的Object里面的方法分析,对里面的方法测试类在main.test.lang.ObjectMethodTest.java * Object为所有类的父类,是在jdk1.0中就定义好的 * 目前没有说明的问题clone()方法的深入理解和toHexString()方法说明,线程方面的说明 */public class ObjectMethodExplain {    /**     * native是关键字。它一般在本地声明,异地用C和C++来实现。它的声明有几点要注意:     * 1)native与访问控制符前后的关系不受限制。     * 2)必须在返回类型之前。     * 3)它一般为非抽象类方法。     * 4)native方法在异地实现,象抽象方法一样,所以没有方法体,以分号结束     *     * 说明:.剩下的.dll文件里面的内容会做一些深度的研究,后续会进行更新     */    //在Object加载的时候会加载registerNatives()方法,并调用.dll文件    private static native void registerNatives();    static {        registerNatives();    }    /**     * 返回运行时候的类因为被final修饰所以不能重写,在main函数中进行了测试,其中返现两个错误     * 1) java.lang.SecurityException: Prohibited package name: java.lang项目中不能以java.什么对包名进行调用     * 2) java.lang.UnsatisfiedLinkError: ObjectMethod.registerNatives()V是因为在调用的时候应当现加载registerNatives()方法     *    而在以上面代码中我们写了一个registerNatives()方法,所以无法运行,需要注释掉registerNatives()方法     */    //public final native Class
getClass(); /** * 返回对象的哈希代码值,支持哈希表,例如:java.util.HashMap * hashCode返回的并不一定是对象的(虚拟)内存地址,具体取决于运行时库和JVM的具体实现。 * 特性如下: * 1) 一致性(consistent),在程序的一次执行过程中,对同一个对象必须一致地返回同一个整数。 * 2) 如果两个对象通过equals(Object)比较,结果相等,那么对这两个对象分别调用hashCode方法应该产生相同的整数结果, * 这里equals和hashCode说的都是Object类的 * 3) 如果两个对象通过java.lang.Object.equals(java.lang.Ojbect)比较,结果不相等,不必保证对这两个对象分别调用hashCode也返回两个不相同的整数 */ public native int hashCode(); /** * 比较两个对象hashCode值是否相同 * @param obj 传入的对象 * @return boolean类型 */ public boolean equals(Object obj) { return (this == obj); } /** * 创建并返回此对象的副本,这个方法的调用类需要实现Cloneable接口,这里面涉及到深浅copy,会在后面进行说明,如果没有实现Cloneable类就不抛出CloneNotSupportedException异常 * @return * @throws CloneNotSupportedException */ protected native Object clone() throws CloneNotSupportedException; /** * 返回一个对象名以及所在的包名+@+hashCode值,后面会对toHexString()方法进行说明 * @return */ public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } /** * 唤醒在这个对象的监视器上等待的单个线程 */ //public final native void notify(); /** * 唤醒在这个对象的监视器上等待的所有线程 */ //public final native void notifyAll(); /** * 使当前线程处于等待的状态知道被notify(),方法和notifyAll()方法所调用 * @param timeout 最大等待时间 */ //public final native void wait(long timeout) throws InterruptedException; /** * 当前线程处于等待的状态知道被notify(),方法和notifyAll()方法所调用 * @param nanos 额外的时间,在纳秒范围0- 999999 * @param timeout 最大等待时间 * */// public final void wait(long timeout, int nanos) throws InterruptedException {// if (timeout < 0) {// throw new IllegalArgumentException("timeout value is negative");// }//// if (nanos < 0 || nanos > 999999) {// throw new IllegalArgumentException(// "nanosecond timeout value out of range");// }//// if (nanos > 0) {// timeout++;// }//// wait(timeout);// } /** * 当前线程处于等待的状态知道被notify(),方法和notifyAll()方法所调用,默认时间为0 */// public final void wait() throws InterruptedException {// wait(0);// } /** * 垃圾回收机制所要用的方法 * @throws Throwable */ protected void finalize() throws Throwable { }}

 

下面是测试类

package test.main.lang;/** * @Auther: luanmihun * @Date: 2018/7/30 17:02 * @Description:java.lang中Object的方法进行测试,具体方法说明请参考java.lang.ObjectMethod */public class ObjectMethodTest implements Cloneable{    public static void main(String[] args) throws Exception {        ObjectMethodTest obj = new ObjectMethodTest();        //getClass()方法测试        System.out.println("getClass()方法测试结果:"+ obj.getClass());        //hashCode()方法测试        System.out.println("hashCode()方法测试结果:"+obj.hashCode());        //equals()方法测试        ObjectMethodTest obj1 = new ObjectMethodTest();        System.out.println("obj的hashCode值为:"+obj.hashCode());        System.out.println("obj1的hashCode值为:"+obj1.hashCode());        System.out.println("equals()方法测试结果:"+obj.equals(obj));        System.out.println("equals()方法测试结果:"+obj1.equals(obj));        //clone()方法测试        System.out.println("clone()方法测试结果:"+obj.clone());        //toString()方法测试        System.out.println("toString()方法测试结果:"+obj.clone());    }}

 

转载于:https://www.cnblogs.com/mihun-666/p/9393440.html

你可能感兴趣的文章
第70天:jQuery基本选择器(一)
查看>>
目前微信 微博 新浪 豆瓣等所有分享的js插件
查看>>
源码包安装
查看>>
处理:“ORA-28002: the password will expire within 7 days”的问题
查看>>
读书笔记—CLR via C#章节4-7
查看>>
linux 命令与文件的查询
查看>>
MYSQL数据库引擎 MYISAM和 INNODB区别
查看>>
设计模式之原型模式
查看>>
BootStrap常用组件及响应式开发
查看>>
TS学习之for..of
查看>>
OpenGL是什么?
查看>>
Oracle - 数据库巡检脚本
查看>>
Oracle 11g数据库详细安装步骤图解
查看>>
机器学习之特征选择---特征选择算法
查看>>
嵌入式开发之hisilicon---hi3536 处理器简介
查看>>
目标跟踪之模板匹配---简单的模板匹配
查看>>
css美化网页元素
查看>>
histogram
查看>>
51单片机点亮双向流水灯
查看>>
字符串前面+r
查看>>