JAVA反射机制中getClass和class对比分析

 更新时间:2017年11月16日 15:08:50   作者:zhouyy40308  
这篇文章主要介绍了JAVA反射机制中getClass和class对比分析,具有一定参考价值,需要的朋友可以了解下。

java有两个获得类名的方法getClass()和class(),这两个方法看似一样,实则不然。这两个方法涉及到了java中的反射。

所谓反射,可以理解为在运行时期获取对象类型信息的操作。传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代码。严格地说,反射并非编程语言的特性,因为在任何一种语言都可以实现反射机制,但是如果编程语言本身支持反射,那么反射的实现就会方便很多。

类型类

要知道类型信息在运行时是如何表示的,这是由Class对象来完成的,它包含了与类有关的信息。Class对象就是用来创建所有“常规”对象的,Java使用Class对象来执行RTTI,即使你正在执行的是类似类型转换这样的操作。

每个类都会产生一个对应的Class对象,也就是保存在.class文件。所有类都是在对其第一次使用时,动态加载到JVM的,当程序创建一个对类的静态成员的引用时,就会加载这个类。Class对象仅在需要的时候才会加载,static初始化是在类加载时进行的。

我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类。Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类。类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型。所有的类型类都是Class类的实例。

联系

一般情况下,getclass()方法和class()方法是等价的,都可以获得一个类型名,例如下面的代码:

class A{
	public void func(){
	}
}
public class Test {
	public static void main(String[] args) {
		A a = new A();
		System.out.println(a.getClass()+" "+A.class);
	}
}

输出的结果为:classAclassA

区别:

两者最直接的区别就是,getClass()是一个类的实例所具备的方法,而class()方法是一个类的方法。

另外getClass()是在运行时才确定的,而class()方法是在编译时就确定了。

例如下面的程序:

class A{
	public void func(){
	}
}
class B extends A{
}
public class Test {
	public static void main(String[] args) {
		A a = new A();
		B b = new B();
		A ab = new B();
		System.out.println(a.getClass()+" "+A.class);
		System.out.println(b.getClass()+" "+B.class);
		System.out.println(ab.getClass());
		ab = a;
		System.out.println(ab.getClass());
	}
}

结果:
class A class A
class B class B
class B
class A

从最后的结果为class B来看,当出现继承和多态时,getclass和class方法的确实有所不同,因为是在运行时确定的,所以结果是ab在运行到这一时刻是所属的类型。

总结

以上就是本文关于JAVA反射机制中getClass和class异同的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

Java反射之Call stack introspection详解

关于Java反射机制 你需要知道的事情

Java的RTTI和反射机制代码分析

如有不足之处,欢迎留言指出。

相关文章

  • java实现从方法返回多个值功能示例

    java实现从方法返回多个值功能示例

    这篇文章主要介绍了java实现从方法返回多个值功能,结合实例形式分析了集合类、封装对象、引用传递三种实现方法,需要的朋友可以参考下
    2017-10-10
  • java 如何将图片按照原尺寸比例存入word中

    java 如何将图片按照原尺寸比例存入word中

    这篇文章主要介绍了java 如何将图片按照原尺寸比例存入word中的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 浅谈Java自定义注解和运行时靠反射获取注解

    浅谈Java自定义注解和运行时靠反射获取注解

    下面小编就为大家带来一篇浅谈Java自定义注解和运行时靠反射获取注解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-03-03
  • 处理@PathVariable注解允许参数为空、允许不传参数的问题

    处理@PathVariable注解允许参数为空、允许不传参数的问题

    这篇文章主要介绍了处理@PathVariable注解允许参数为空、允许不传参数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • SpringBoot2.0集成Swagger2访问404的解决操作

    SpringBoot2.0集成Swagger2访问404的解决操作

    这篇文章主要介绍了SpringBoot2.0集成Swagger2访问404的解决操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java8的DateTimeFormatter与SimpleDateFormat的区别详解

    Java8的DateTimeFormatter与SimpleDateFormat的区别详解

    这篇文章主要介绍了Java8的DateTimeFormatter与SimpleDateFormat的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • springboot集成mybatisplus的方法

    springboot集成mybatisplus的方法

    这篇文章主要为大家详细介绍了springboot集成mybatisplus的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • spring mvc 组合mybatis框架实例详解

    spring mvc 组合mybatis框架实例详解

    本项目采用 maven 结构,主要演示了 spring mvc + mybatis,controller 获取数据后以json 格式返回数据。对spring mvc 组合mybatis的方法感兴趣的朋友可以参考下本文
    2018-01-01
  • java线程池工作队列饱和策略代码示例

    java线程池工作队列饱和策略代码示例

    这篇文章主要介绍了java线程池工作队列饱和策略代码示例,涉及线程池的简单介绍,工作队列饱和策略的分析及代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11

最新评论