加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。
在一个类的外部,是不能通过类的实例化对象调用私有化的属性和方法。
通过反射可以调用类的私有化属性和方法。
Q:通过直接new对象和反射的方式都可以调用公共结构,开发中用哪个?
A:建议直接使用new的方式。在编译中无法确定需要new谁的对象,则使用反射的方式。
Q:反射和封装是否矛盾?
A:不矛盾。反射的特征:动态性。可以将<code>封装</code>视为一种提示,提示你需要调用私有化属性或方法时,可以调用公共的属性和方法来代替直接调用它。反射表示的是一种能力,表示能不能调用属性和方法。
类的加载过程:
程序经过<code>javac.exe</code>命令以后,会生成一个或多个字节码文件(.class结尾)。
接着我们使用<code>java.exe</code>命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中。此过程就称为类的加载。加载到内存中的类,我们就称为运行时类,此运行时类,就作为<code>CLass</code>的一个实例。
获取Class的实例