β

对getClass的理解

天地一MADAO的个人空间 34 阅读

之前看过一些博客,大致记得java加载器是bootstrap 、extension和Application(又叫System加载器)。用我那匮乏的词汇说就是先委托父加载器,实在找不到这个类再加载自己。bootstrap用来加载rt.jar(记得大二时非要在没JVM的环境下运行java,用GREEN JVM时记得这个包有90M,因为主要的类都在这里)。extension加载的类是在jre/lib/ext,system是classpath下的东东。其实类和类的区别主要看是不是用同一个加载器加载的,如果不是,就是不同的类。

今天CVTE笔试,做了个getClass相关的题,原题是

class A{
}
class B extends A{
}
public class demo{
	public static void main(String[] args) {
		A a=new A();
		B b=new B();
		A a2=b;
		System.out.println(a2.getClass().getName());
	}
}

估计准备本科工作的学生在复习时这题肯定没少看过,觉得这题很简单,背都背下来了,但如果真让我非常详细的说下RTTI和反射,我肯定说得糊涂半片的。所以借这机会也算好好复习一下Java。

Class类是为了保存JAVA虚拟机的运行时类型信息RTTI对所有对象进行类型识别的信息而设立的.当然Class也是继承自Object类的,每个类都有Class对象,是java的一个反射机制。虽然我还不理解啥是反射机制,但我明白这个东东是用来描述Class属性的。Class类是RTTI实现的方法,而getClass得到的就是这个Class类对象的引用。

Java的反射机制的实现要借助于Class,Constructor,Field,Method4个类,Class是对象的运行时类,Constructor就是构造器类(这个东东也经常会问到,尤其是初始化顺序,相关的资料非常多),而Field和Method就是属性和方法了,这两个我是完全不懂。我记得hibernate的延迟载入,spring的AOP都是这么实现的(忽然感觉还有很多东西要好好看看)。

虽然B类还是B类,这个题只是拿上塑造型来迷糊人,但也提醒了我一下这一部分对我来说确实是个盲区。我会的东西也就这么点儿了,先记下来回头好好梳理梳理,如果对谁能有点帮助是最好了,当然更希望有高手能发个连接补充一下。





作者:天地一MADAO的个人空间
天地一MADAO的博客
原文地址:对getClass的理解, 感谢原作者分享。

发表评论