![](/img/trans.png)
[英]Difference between calling a class constructor and using Class.forName().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.