这一章节我们来介绍一下Class对象。
在介绍前有几点需要注意的:
1.每一个类都有一个Class对象,在jvm的类加载器子系统里面生成。
2.类加载器子系统包含类加载器链,但是只有一个原生加载器,原生加载器主要加载javaapi里面的可信的类。
3.只有当类被使用的时候才会加载,这个称之为动态加载。
4.只有加载了Class,才能new这个类的所有对象。
由于前面几点都暂时没有办法证明,只能当概念记住,我们下面举例说明最后一点:
package com.ray.ch11;
public class Test {
public static void main(String[] args) {
new A();
try {
Class.forName("com.ray.ch11.B");//需要包名+类名
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class A {
static {
System.out.println("loading A");
}
public A() {
System.out.println("created A");
}
}
class B {
static {
System.out.println("loading B");
}
public B() {
System.out.println("created B");
}
}
输出:
loading A
created A
loading B
注意:在使用Class.forName的时候后面的字符串需要全名(包名+类名)。
从输出看见,create在load之后,证明了上面的描述,类是先加载后创建对象的。而在只是使用Class.forName的B中,其实只是加载B这个类,而且取得B类型的Class对象的引用(B类在加载的同时已经创建的B的Class对象),而没有创建任何B的对象。
除了Class.forName可以获取B类型的Class对象的引用,也可以通过B的对象那里获取,还可以在B.getClass()这里获取,我们下面举例:
package com.ray.ch11;
public class Test {
public static void main(String[] args) {
B b = new B();
System.out.println(b.getClass().getName());
System.out.println(B.class.getName());
}
}
class B {
static {
System.out.println("loading B");
}
public B() {
System.out.println("created B");
}
}
输出:
loading B
created B
com.ray.ch11.B
com.ray.ch11.B
总结:这一章节我们简单的讲述了Class对象的概念与使用情况,我们下一章节将会继续讲述Class对象的使用以及一些注意的地方。
这一章节就到这里,谢谢。
-----------------------------------