new
运算符和Class.forName(...).newInstance()
之间有什么区别?它们都创建了一个类的实例,我不确定它们之间的区别。
答案 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();
}