Class.forName 与 classObj.newInstance 方法

Class.forName(String name), 用于获取指定对象。classObj.newInstance() 返回一个classObj 随代表的类的对象。

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

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

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 对象:

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();
        }

    }
}

Class.forName(String name)方法传入类的完整路径 "indi.chester.classdemo.Employee",返回一个代表Employee信息的对象 empClass。

empClass.newINstance() 调用 Employee 的默认无参构造方法,返回一个 Object 对象, 需要进行强制转换成 Employee 对象。

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

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

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

Last updated

Was this helpful?