//定义person类
package entities;
public class Person {
private String name;
private int age;
private static int total;
public Person() {
super();
System.out.println("调用了空构造方法");
total++;
}
static {
//这句话在执行 Class.forName("entities.Person")的时候就会被执行。
System.out.println("调用了static静态块。");
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
total++;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static int getTotal() {
return total;
}
public static void setTotal(int total) {
Person.total = total;
}
public String toString() {
return "name:\t"+name+"\tage:\t"+age+"\ttotal:\t"+total;
}
}
//定义测试类
package entities;
public class Test {
public static void main(String[] args) {
try {
//使用class.forName()加载类
Class<Person> cp1 = (Class<Person>) Class.forName("entities.Person");
Person p1 = cp1.newInstance();
System.out.println(p1.getTotal());
//使用ClassLoader。getSystemClassLoader().loadClass();方式获取Class
Class<Person> cp2 = (Class<Person>)ClassLoader.getSystemClassLoader().loadClass("entities.Person");
Person p2 = cp2.newInstance();
System.out.println(p2.getTotal());
//使用Person.class获取Class
Class<Person> cp3 = Person.class;
Person p3 = cp3.newInstance();
System.out.println(p3.getTotal());
/*
* 整个过程中static块只是被加载了一次,而空的构造方法则被加载了3次
* 三种方式的加载类的差别
*
* 第一种方式加载类的时候需要处理异常,NoClassDefFoundError
* 就是类没有被定义的意思,这种情况下就是你要么是没有把jar包引入进来,要么是你的类的名字出错了。
*
* 第二种方式也是需要处理同样的异常的。
*
* 第三种方式是基本上不使用,因为这很显然没有扩展性,你的Class是事先确定好的,不可以进行动态的配置。
* 它其实也还是要处理异常的,因为虽然这个时候Person是肯定存在的,但是如果Person里面没有空的构造方法也是不行的。
*
* */
} catch (Exception e) {
e.printStackTrace();
}
}
}