# Class.forName 与 classObj.newInstance 方法

下面通过举例来说明两个方法的使用场景:

定义一个员工类 Employee， 我们只设置了一个无参的默认构造方法。

```java
public class Employee {
    private int empno;
    private String empname;
    
    static {
        System.out.println("类已被加载到JVM");
    }

    public Employee( ) {
        System.out.println("默认构造方法被执行");
    }

    @Override
    public String toString() {
        return "Employee{" +
                "empno=" + empno +
                ", empname='" + empname + '\'' +
                '}';
    }

}
```

**顺带一说, 类中的 static 代码块, 不需要实例化即可执行, 且执行顺序先于构造方法。**

我们通过 反射 机制来创建一个 Employee 对象:

```java
public class ClassDemo {
    public static void main(String[] args) {

        try {
            //将 指定 类加载到 JVM, 并返回Class 对象
            Class empClass = Class.forName("indi.chester.classdemo.Employee");

            // 通过 Class 对象.newInstance() 调用默认无参构造函数 进行实例化
            Employee  emp1=(Employee ) empClass.newInstance();
            System.out.println(emp1);

        } catch (ClassNotFoundException e) {// 找不到类 异常
            e.printStackTrace();
        } catch (InstantiationException e) {// 无法实例化 异常
            e.printStackTrace();
        } catch (IllegalAccessException e) {// 无法访问 异常
            e.printStackTrace();
        }

    }
}
```

顺带一说, **Object 类是所有Java类的父类**。

最后我们输出 Employee 对象， 得到下面结果:

```yaml
类已被加载到JVM 
默认构造方法被执行 
Employee{empno=0, empname='null'}
```
