欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-04-01 20:43:58
java有两个获得类名的方法getclass()和class(),这两个方法看似一样,实则不然。这两个方法涉及到了java中的反射。 所谓反射,可以理解为在运行时期获取对...

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和反射机制代码分析

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