繁体   English   中英

使用.newInstance()和不使用?有什么区别?

[英]What is the difference between using .newInstance() and not using?

我看到很多连接到db的java示例,调用newInstance() 有些人根本不使用它。 我试过两个并且工作正常。 我不明白为什么有些用,有些不用?

...
Class.forName("com.mysql.jdbc.Driver").newInstance();
...
...
Class.forName("com.mysql.jdbc.Driver");
...

现代 Java中,这些都不是必需的。

在“过去的好时光”中使用Class.forName的原因是它将运行类型初始化代码,该代码将使用JDBC注册驱动程序。 您不需要创建驱动程序的新实例,因此您的第一个示例从未被要求过。

但是,现在不需要它 - DriverManager使用标准服务提供程序机制来查找驱动程序。 我很惊讶地看到任何生产质量的驱动程序现在都不支持这一点。

其他情况下,您可能会看到使用或不使用newInstance()调用Class.forName()代码,这两个是单独的调用:

  • Class.forName(String)是一个静态方法,用于查找/加载具有指定的完全限定名称的Class对象...就像您在编译时使用Foo.class ,但不知道名称Foo
  • Class.newInstance()是一个实例方法,它创建由Class对象表示的Class的新实例,该对象是方法的目标,调用无参数构造函数。 所以Foo.class.newInstance()有点像new Foo() - 除了再次,你不需要在编译时知道Foo (例如,如果你通过Class.forName获得了Class引用,或者接受了它作为方法参数)
Class.forName("com.mysql.jdbc.Driver");

这只是在类加载器中初始化提到的类。

Class.forName("com.mysql.jdbc.Driver").newInstance();

返回该类的实例。

在这种特定情况下,Driver类的初始化就足够了。

Class.forName("com.mysql.jdbc.Driver");

这将动态加载给定的类名,如果存在则会抛出ClassNotFoundException

Class.forName("com.mysql.jdbc.Driver").newInstance();

除此之外,这将执行上述操作,还将创建给定类名的新对象/实例。

在jdbc中,第一个就足够了,因为我们只需要注册jdbc驱动程序,就不需要显式创建新的对象/实例。

您也可以通过命令行选项手动加载jdbc驱动程序。

java -Djdbc.drivers=com.mysql.jdbc.Driver MyApp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM