Java源码分析之Object

Java源码分析之Object

1.位于java.lang包下,从JDK1.0就有了。

2.是所有类的父类,属于金字塔顶尖位置,没有父类。

3.方法

1)

<span style="font-size:14px;"> private static native void registerNatives();
    static {
        registerNatives();
    }</span>

registerNatives()方法,本地方法,具体是用C或C++在DLL中实现的,然后通过JNI(Java Native Interface)调用静态代码块,只执行一次,在使用Object的时候执行。由于JVM加载类的机制(双亲委托加载机制),所以Object总是第一个加载的类,导致了registerNatives()总是在最开始的时候就执行了。

2)
public final native Class<?> getClass();
本地方法,返回此对象的Class对象。

3)
    public native int hashCode();
hashcode()本地方法。
常规协定:
1.在程序执行过程中,对同一个对象多次调用hashcode方法时,必须得到的是相同的整数,前提是将对象进行equals方法时所用的信息没有修改过。
2.如果两个对象使用equals方法比较得到的结果是相等的,那么这两个对象使用hashcode方法必须生成相同的整数。
3.如果根据equals方法,两个对象不相等,那么这两个对象的hashcode可以相等也可以不相等。

4)
    public boolean equals(Object obj) {
        return (this == obj);
    }
Object中equals()默认采用的是“==”,比较是两个对象的内存地址是否相等。

5)
    protected native Object clone() throws CloneNotSupportedException;
clone(),本地方法,当需要拷贝的时候调用,分为浅拷贝和深拷贝,拷贝的类需要实现cloneable接口,深拷贝需要重写clone()方法,当然第一句话是super.clone(),调用父类Object()的clone()。如果拷贝的对象没有实现cloneable接口,会抛CloneNotSupportedException异常,表示这个对象不支持拷贝。

6)
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
toString()默认返回的字符串是类名+@+内存地址,String类重写了这个方法。

7)
    public final native void notify();
notify()本地方法,唤醒在此对象监视器上等待的单个线程,由JVM选择一个线程唤醒。

8)
    public final native void notifyAll();
notifyAll()本地方法,唤醒在此对象监视器上等待的所有线程。

9)
    public final void wait() throws InterruptedException {
        wait(0);
    }
在其他线程调用此对象notify()或者notifyAll()前,导致当前线程等待。
当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过notify()或者notifyAll()唤醒此线程。

    public final native void wait(long timeout) throws InterruptedException;
本地方法,超过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 >= 500000 || (nanos != 0 && timeout == 0)) {
            timeout++;
        }

        wait(timeout);
    }

10)
    protected void finalize() throws Throwable { }
当垃圾回收器确定不存在对该对象的引用时,由对象的垃圾回收器调用此方法。

*问题:
1.什么是native method?
一个native method是由非Java语言实现,是C或者C++,Java调用这些非Java代码的接口。

2.为什么要使用native method?
1)有时Java应用需要与Java外面的环境交互。Java需要与一些底层系统如操作系统或某些硬件交换信息,本地方法提供了这样一个机制:为我们提供一个简单的接口,而不需要我们去了解底层复杂的细节。
2)Sun的解释器采用的C实现,而JRE大部分是用Java实现的,它通过一些本地方法与外界交互。本地方法事实上大多数情况下有外部的动态链接库提供,然后被JVM调用。

3.JVM怎么使用native method?
        当一个类第一次被被使用时,这个类的字节码会被加载到内存,并且只会回载一次。在这个被加载的字节码的入口维持着一个该类方法所有描述符的list,这些方法描述符描述一些信息:方法代码存在什么地方,方法有哪些参数,方法的描述符之类的等等。
        如果一个方法描述符内有native,这个描述符将有一个指向该方法的实现的指针。这些实现在一些DLL文件内,但是他们会被操作系统加载到Java程序的地址空间。当一个带有本地方法的类被加载时,其相关的DLL文件并未被加载,因此指向方法实现的指针并不会被设置。当本地方法被调用之前,这些DLL才会被加载,这是通过调用java.system.loadLibrary()实现的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的MetaObjectHandler是Mybatis框架中用于处理实体的公共字段的接口,它提供了在插入和更新操作时自动填充实体的公共字段的方法。我们来看一下它的源码实现。 MetaObjectHandler接口的定义如下: ```java public interface MetaObjectHandler { void insertFill(MetaObject metaObject); void updateFill(MetaObject metaObject); } ``` 该接口中定义了两个抽象方法insertFill和updateFill,这两个方法分别用于在插入和更新操作时自动填充实体的公共字段。 MetaObject是Mybatis框架中用于封装Java对象的一个通用,通过反射获取Java对象的属性和方法,从而实现对Java对象的读写操作。MetaObjectHandler中的insertFill和updateFill方法参数中的MetaObject对象就是Java对象的封装,可以通过该对象来获取Java对象的属性和方法,从而实现对实体的公共字段的填充操作。 下面是一个示例代码,演示了如何在实体中自动填充创建时间和更新时间: ```java public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { LocalDateTime now = LocalDateTime.now(); this.setFieldValByName("createTime", now, metaObject); this.setFieldValByName("updateTime", now, metaObject); } @Override public void updateFill(MetaObject metaObject) { LocalDateTime now = LocalDateTime.now(); this.setFieldValByName("updateTime", now, metaObject); } } ``` 在上述示例代码中,我们实现了MetaObjectHandler接口,并重写了其中的insertFill和updateFill方法。在insertFill方法中,我们获取当前时间,并通过setFieldValByName方法将其赋值给实体的createTime和updateTime字段;在updateFill方法中,我们同样获取当前时间,并将其赋值给实体的updateTime字段。 最后,我们需要在Mybatis的配置文件中配置MyMetaObjectHandler: ```xml <!-- 配置自定义的MetaObjectHandler --> <bean id="myMetaObjectHandler" class="com.example.MyMetaObjectHandler"/> <!-- 配置全局的MetaObjectHandler --> <mybatis:configuration> <mybatis:defaultScriptingLanguage type="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"> <mybatis:property name="metaObjectHandler" ref="myMetaObjectHandler"/> </mybatis:defaultScriptingLanguage> </mybatis:configuration> ``` 在上述配置文件中,我们通过id为myMetaObjectHandler的bean来配置自定义的MetaObjectHandler,然后通过属性metaObjectHandler将其注入到Mybatis的配置中。这样,我们就可以在插入和更新操作时自动填充实体的公共字段了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值