1. 9IM首页
  2. 热点

Object类自带的方法

registerNatives

首先Object类有一个本地方法registerNatives(),会在类加载时调用,主要是将Object类中的一些本地方法绑定到指定的函数中去,便于之后调用。例如将hashCode和clone本地方法绑定到JVM_IHashCode和JVM_IHashCode函数。

    private static native void registerNatives();
    static {
        registerNatives();
    }

想深入了解的朋友可以看看这两篇文章:

Java之Thread源码registerNatives()深入理解

Object类中的registerNatives方法的作用深入介绍

getClass

getClass()方法会返回对象的运行时类。

    public final native Class<?> getClass();

具体可以看下面这个例子:

有一个类Son,继承于Father类,instance的编译类型是Father,实际赋值的是一个Son对象,所以调用instance.getClass()获取的是instance对象的运行时类型,打印的类名是”com.test.Son”。

  package com.test;
  class Father {}

  class Son extends Father {}
   
  Father instance = new Son();
  Class class1 = instance.getClass();
  System.out.println("class1 is"class1);

输出结果:

class1 is class com.test.Son

Classs.forName

getClass()类似的方法还有两个,一个是Class类中的forName()方法,也是在运行时,根据传入的类名去加载类,然后返回与类关联的Class对象。也正是因为是动态加载,在编译时可以没有这个类,也不会对类名进行检验,所以有可能抛出ClassNotFoundException异常。

public static Class<?> forName(String className)
                throws ClassNotFoundException {
        Class<?> caller = Reflection.getCallerClass();
        return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}

可以自己尝试运行一下这段代码

  Class class2 = null;
  try {
  	class2 = Class.forName("com.test.Son");//如果实际不存在com.test.Son这个类,那么会抛出ClassNotFoundException异常
  	System.out.println(class2);
  } catch (ClassNotFoundException e) {
  	e.printStackTrace();
  }
class2 is class com.test.Son

类名+.class

还有一种方式是使用类名+.class来获取类关联的Class对象,与上面两种方法不同之处在于,它返回的是编译时类型,也就是在编译时,类加载器将类加载到JVM中,然后初始化一个Class对象返回。

  Class class3 = Son.class;
  System.out.println(class3);

输出结果:

	class3 is class com.test.Son

PS:无论是使用哪种方式来获取类关联的Class对象,类都是只会加载一次,如果获取Class对象时,不会重复加载类。

原创文章,作者:9IM,如若转载,请注明出处:https://www.9im.cn/457.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注