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的RTTI和反射机制代码分析,包括了Java的RTTI和反射机制代码分析的使用技巧和注意事项,需要的朋友参考一下 RTTI,即Run-Time Type Identification,运行时类型识别。运行时类型识别是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息。RTTI能在运行时就能够自动识别每个编译时已知的类型。 很多时候需要进行向上转型,比如Bas
本文向大家介绍java 反射机制,包括了java 反射机制的使用技巧和注意事项,需要的朋友参考一下 本文导引: 通过反射机制 获取类的基本信息 获取类的注解信息 获取泛型信息 output: 下面的例子,是通过反射机制获取类的注解信息。 output: 下面的例子,是通过反射机制获取泛型信息 output: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多
主要内容:java.lang.Class 类,java.lang.reflect 包实现 Java 反射机制的类都位于 java.lang.reflect 包中,java.lang.Class 类是 Java 反射机制 API 中的核心类。本节将从这两个方面讲解 Java 反射机制 API。 可参考《Java反射机制的基本概念》一节中介绍的关于 Java 反射机制获取类对象相关信息的方法,来学习本节内容。 java.lang.Class 类 java.lang.Class 类是实
Java 反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息。反射还可以让我们在运行期实例化对象,调用方法,通过调用 get/set 方法获取变量的值。
本文向大家介绍Java反射机制(Reflection)浅析,包括了Java反射机制(Reflection)浅析的使用技巧和注意事项,需要的朋友参考一下 Reflection也就是反射,是Java语言的一个重要特征,我们知道,在使用一个类之前,我们往往都已经创建好它了,比如创建一个类文件,然后再写些属性、方法等,也就是这种类是静态的,但反射机制却允许你动态地创建一个类。除了动态地创建一个类外,我们还
本文向大家介绍Java中的反射机制详解,包括了Java中的反射机制详解的使用技巧和注意事项,需要的朋友参考一下 Java中的反射机制详解 反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧! 一,先看一下反射的概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修