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

时间:2011-01-06 06:27:53

标签: java reflection new-operator

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

10 个答案:

答案 0 :(得分:47)

new运算符创建一个静态已知类型的新对象(在编译时),并且可以调用您尝试创建的对象上的任何构造函数。这是创建对象的首选方式 - 它很快,JVM对它进行了大量的积极优化。

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

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

答案 1 :(得分:11)

如果需要动态实例化类,

Class.forName("your class name").newInstance()很有用,因为您不必对类名进行硬编码来创建对象。

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

答案 2 :(得分:5)

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

答案 3 :(得分:3)

主要区别是Class.forName('your class name').newInstance()是动态的,因为类型不需要硬编码到代码中。

答案 4 :(得分:3)

当你想要一个类似于Class.forName("your class name").newInstance()的类工作的实例时,会使用

new,但是当你想从jar文件或远程服务器中的类中获取实例时,它会很有用。你不能在编译时导入它。

ex:Class.forName("YOUR JDBC DRIVER").newInstance(),您无法在编译时导入JDBC类。

答案 5 :(得分:2)

如果尚未加载,则

Class.forName('myClass').newInstance()加载该类。这里它调用初始构造函数,只执行构造函数的静态部分。

new运算符用于初始化新对象。

您可以从new运算符创建多个实例,并且Class.forName()差异是您第二次创建newInstance()静态块时将无法初始化。

Class.forName('myClass).newInstance()的一个很好的例子是JDBC驱动程序

Class.forName("com.mysql.JDBC.Driver").newInstance()

答案 6 :(得分:1)

Class.forName将执行查找以查找Class的{​​{1}}对象。

使用new运算符应与YourClass相同。

答案 7 :(得分:0)

虽然两者都有效地做同样的事情,但你应该使用new运算符而不是使用Class.forName('class')。getInstance()。后者使用反射API在运行时查找类。通过使用new运算符,VM将事先知道您要使用该类,从而提高效率。

答案 8 :(得分:0)

我们假设com.statckoverflow.Test

Class.forName - 它将加载Test类并返回包含Test类元数据的Class类对象,如name,package,constructor,annotations,methods,fields。

newInstance() - 用于使用Java Reflection实例化新对象。将在Test类上调用内部零参数构造函数。这意味着Class类对象将通过调用零参数构造函数来创建Test类对象。我们可以使用反射来获取Test类的详细信息。像构造函数,方法等。

new operator - 为类创建新对象,实例化Class,并可以调用它们的构造函数。

答案 9 :(得分:-1)

如果没有对象的零参数构造函数,它也会创建一个对象并且不会抛出任何异常,请查找下面的代码片段。

try {
    Class o = Class.forName("com.myCompany.MyClass");

    Constructor m = o.getConstructor(Integer.class,String.class);
    m.newInstance(new Integer(0),new String(""));

} catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (InstantiationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (SecurityException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (NoSuchMethodException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (InvocationTargetException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}