java.lang -> Object
java.lang → Object
是什么
Object 类是类层次结构的根,是 Java 中唯一一个没有父类的类,Java 中所有对象包括数组都继承了 Object 类中的方法。
重要方法
public class Object {
private static native void registerNatives();
static {
registerNatives();
}
}
首先引入眼帘的就是一个静态的 native 方法 registerNatives() 通过名字就能大概判断出来时注册本地方法的意思.我们可以通过 OpenJDK 中找到对应的文件来查看。
路径是:/jdk8/jdk/src/share/native/java/lang/Object.c

之后就能看到 Object.c 的文件了我们点击打开后会发现 Java_java_lang_Object_registerNatives 这样的一个函数名称,这是为了让 JVM 找到本地函数,它们会被一定方式命名而我们的 private static native void registerNatives(); 对应的函数名就是 Java_java_lang_Object_registerNatives。
#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);
}
}
看了上面我们发现了有一个名字叫 methods 的数组里面不是定义了 Object 中的函数么。我们可以发现 registerNatives 函数的作用原来是将指定的本地方法绑定到指定的函数。将 hashCode 绑定到 JVM_IHashCode 等等。
而然我们发现了 Object 类中的所有方法都是 native 的并且通过上面的都已经注册了对应的 C++ 函数。
public final native Class<?> getClass();
通过上图我们发现 getClass() 函数对应了 Java_java_lang_Object_getClass 方法在里面调用了 GetObjectClass。
一些非本地方法
equals
public boolean equals(Object obj) {
// 直接对比对象在堆内存中的物理地址
return (this == obj);
}
toString
public String toString() {
// 调用本地方法 getClass() 后再获取 name + "@" + 根据 hashCode 的 16 机制无符号整数
// Integer 会在包装类中讲
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
还有一个比较有意思的函数
/**
* timeout 毫秒
* nanos 纳秒
*/
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
// 如果纳秒数小于 0 或者 > 999 999 则抛出异常
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
// 如果那描述在 0 ~ 999 999 范围内
if (nanos > 0) {
// 重点来了考试要考,居然让毫秒数 + 1 这个感觉有点萌 很皮 皮一把很开心
timeout++;
}
wait(timeout);
}
java.lang -> Object的更多相关文章
- centos 解压jdk安装包方式安装jdk 出现 java/lang/NoClassDefFoundError: java/lang/Object 错误
安装完JDK ,设定环境变量后出现这个错误: [root@localhost lib]# javacError occurred during initialization of VMjava/lan ...
- Java总结篇系列:java.lang.Object
从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java ...
- type parameters of <T>T cannot be determined; no unique maximal instance exists for type variable T with upper bounds int,java.lang.Object
今天在进行代码检查的时候出现下面的异常: type parameters of <T>T cannot be determined; no unique maximal instance ...
- 解决本机安装多版本jdk导致The type java.lang.Object cannot be resolved It is indirectly referenced ...
本机开始安装了jdk1.6,然后安装了jdk1.8 当在调自动化的时候,发现传入函数传参String类型,报错The type java.lang.Object cannot be resolved ...
- 使用eclipse JDT compile class,解决 无法确定 X 的类型参数;对于上限为 X,java.lang.Object 的类型变量 X,不存在唯一最大实例
ant 命令行方式执行build javac编译class出现 泛型无法转换 无法确定 <X>X 的类型参数:对于上限为 X,java.lang.Object 的类型变量 X,不存在唯一最 ...
- Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/Object
本地原来已经安装了JAVA JDK1.7并配置好了环境变量; 然后又安装了JDK8,想2个版本并存. 然后发现eclipse 打不开,闪退.然后查看环境: 发现 C:\Users\Administra ...
- eclipse中java文件报错:The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files
问题:The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class fi ...
- 部署hibernate框架项目时出现问题:The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files.
基本情况: (这些其实关系不大)我是直接impor导入HibernateDemo项目到eclipse中的,该项目的hibernate版本是3.6.7.Final版,使用了Hibernate Tools ...
- 【典型错误】The type java.lang.Object cannot be resolved.
参考:http://blog.csdn.net/wo519074786/article/details/7697967 The type java.lang.Object cannot be reso ...
- java数组、java.lang.String、java.util.Arrays、java.lang.Object的toString()方法和equals()方法详解
public class Test { public static void main(String[] args) { int[] a = {1, 2, 4, 6}; int[] b = a; in ...
随机推荐
- jQuery获取地址url的参数
例如:网址 http://localhost:26459/Master.aspx?5 $(function () { var url = location.search; if (url.inde ...
- 关于Ext4 extraParams 不能传递动态参数的问题解决办法
可以监听请求发送之前的事件:beforeload ,然后再添加请求的参数 me.store = Ext.create('Ext.data.JsonStore', { remoteSort: true, ...
- SQL语句优化方式
不要使用*号进行查询操作,使用具体字段. 索引 在where子句和order by 涉及的字段上合理的添加索引. where 子句优化 避免在where子句中对null值进行判断,应对字段设置默认值 ...
- npm安装报错:Error: EACCES: permission denied
报错如下: sudo npm i webpack -g /Users/xesfe/.npm-global/bin/webpack -> /Users/xesfe/.npm-global/lib/ ...
- Python3学习笔记(MOOC)
文本进度条实例 #!/usr/bin/env python3 import time #for i in range(101): # print ("\r{:3.0f}%".for ...
- 【学习总结】Python-3-逻辑运算符
参考:菜鸟教程-Python3运算符 逻辑运算符的计算规则划重点: 并不是只返回布尔型,有时会返回变量的数值 (优先级:not>and>or) 总结: '与或非'三件套中,not与数学逻辑 ...
- keepalive+nginx
1Nginx+keepAlived负载均衡高可用1.1Nginx+keepAlive架构图 1.1.1主机宕机 1.1.2主机恢复 1.1.3高可用环境 两台nginx,一主一备:192.168.10 ...
- sql优化案例1
--访客数 ) from ( select v.idvisitor from ods.piwik_log_visit v , , group by v.idvisitor) --优化后的访客数查询 s ...
- C# string.Format json格式字符串报错”输入字符串的格式不正确“
当我们在string.Format中传入Json字符串时,会报”输入字符串的格式不正确“,这是因为json的"{"符号的问题,最开始我是想着用转义一下"{",但 ...
- Django Rest框架 流程详解
什么是Restful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度类审 ...