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将执行查找以查找YourClassClass对象。

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