new运算符和Class.newInstance()之间有什么区别?

i2i*_*eya 32 java reflection new-operator

new运营商和Class.forName(...).newInstance()?有什么区别?它们都创建了一个类的实例,我不确定它们之间的区别.

tem*_*def 52

new操作创建一个是静态已知的(在编译时),并可以调用你想创建对象的任何构造一个类型的新对象.这是创建对象的首选方式 - 它很快,JVM对它进行了大量的积极优化.

Class.forName().newInstance()是一个动态构造,用于查找具有特定名称的类.它比使用慢,new因为对象的类型不能硬编码到字节码中,并且因为JVM可能必须进行权限检查以确保您有权创建对象.它也部分不安全,因为它总是使用零参数构造函数,如果你想要创建的对象没有一个无效的构造函数,它会抛出一个异常.

简而言之,new如果您在编译时知道要创建的对象类型,请使用.使用Class.forName().newInstance(),如果你不知道你会作出什么类型的对象.


And*_*s_D 11

Class.forName("your class name").newInstance() 如果需要动态实例化类,则非常有用,因为您不必对类名进行硬编码来创建对象.

想象一下从远程源动态加载类的场景.您将知道他们的名字,但无法在编译时导入它们.在这种情况下,您无法使用new创建新实例.这是(一个原因)Java提供该newInstance()方法的原因.


sta*_*ker 5

Class.forName只能调用默认构造函数(没有参数),并且可以在运行时提供类名,例如从配置文件中读取的db-driver名称.