new运算符和Class.newInstance()有什么区别?
new
运算符和Class.forName(...).newInstance()
之间有什么区别Class.forName(...).newInstance()
? 它们都创建了一个类的实例,我不确定它们之间的区别。
new
运算符创建一个静态已知类型的新对象(在编译时),并且可以调用您尝试创建的对象上的任何构造函数。 这是创建对象的首选方式 – 它很快,JVM对它进行了大量的积极优化。
Class.forName().newInstance()
是一个动态构造,用于查找具有特定名称的类。 它比使用new
要慢,因为对象的类型不能硬编码到字节码中,并且因为JVM可能必须进行权限检查以确保您有权创建对象。 它也部分不安全,因为它总是使用零参数构造函数,如果您尝试创建的对象没有一个无效的构造函数,它会抛出exception。
简而言之,如果您在编译时知道要创建的对象类型,请使用new
。 如果你不知道你将要制作什么类型的对象,请使用Class.forName().newInstance()
。
Class.forName("your class name").newInstance()
如果你需要动态地实例化类, Class.forName("your class name").newInstance()
很有用,因为你不必硬编码类名来创建一个对象。
想象一下从远程源动态加载类的场景。 您将知道他们的名字,但无法在编译时导入它们。 在这种情况下,您无法使用new
来创建新实例。 这是(一个原因)Java提供newInstance()
方法的原因。
Class.forName只能调用默认构造函数(没有参数),并且可以在运行时提供类名,例如从配置文件中读取的db-driver名称。
主要的区别是Class.forName('your class name').newInstance()
是动态的,因为类型不需要硬编码到代码中。
Class.forName("your class name").newInstance()
当你想要一个类似于new
的类工作时,使用Class.forName("your class name").newInstance()
,但是当你想从jar文件或远程的类中获取实例时它很有用服务器,你不能在编译时导入它。
例如: Class.forName("YOUR JDBC DRIVER").newInstance()
,你不能在编译时导入JDBC类。
Class.forName('myClass').newInstance()
加载该类(如果尚未加载)。 这里它调用初始构造函数,只执行构造函数的静态部分。
new
运算符用于初始化新对象。
您可以从new
运算符和Class.forName()
创建许多实例。第二次创建newInstance()
静态块将不会被初始化。
Class.forName('myClass).newInstance()
一个很好的例子是JDBC驱动程序
Class.forName("com.mysql.JDBC.Driver").newInstance()
Class.forName
将执行查找以查找YourClass
的Class
对象。
使用new运算符应与YourClass.class.newInstance()
相同。
虽然两者都有效地做同样的事情,但你应该使用new运算符而不是使用Class.forName(’class’)。getInstance()。 后者使用reflectionAPI在运行时查找类。 通过使用new运算符,VM将事先知道您要使用该类,从而提高效率。
我们假设com.statckoverflow.Test
Class.forName
– 它将加载Test类并返回包含Test类元数据的Class
类对象,如name,package,constructor,annotations,methods,fields。
newInstance()
– 用于使用Java Reflection实例化新对象。 将在Test
类上调用内部零参数构造函数。 这意味着Class
类对象将通过调用零参数构造函数来创建Test
类对象。我们可以使用reflection来获取Test
类的详细信息。 像构造函数,方法等
new
运算符 – 为类创建新对象实例化Class
并可以调用它们的构造函数。
如果没有对象的零参数构造函数,它也会创建一个对象并且不会抛出任何exception,请查找下面的代码片段。
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(); }