“Class.forName()”和“Class.forName().newInstance()”

“Class.forName()”和“Class.forName().newInstance()”之间有什么区别?

.之间的区别是什么?Class.forName()Class.forName().newInstance()?

我不明白其中的重大区别(我读过一些关于它们的文章)。你能帮帮我吗?


慕码人8056858
浏览 272回答 3
3回答

喵喵时光机

forName()为您提供了类对象,这对于反射非常有用。这个对象所拥有的方法是由Java定义的,而不是由编写类的程序员定义的。每个班级都是一样的。调用newInstance()为您提供了该类的实例(即调用Class.forName("ExampleClass").newInstance()它相当于调用new ExampleClass()),您可以在该方法上调用类定义的方法,访问可见字段等。

偶然的你

在JDBC世界中,正常实践(根据JDBCAPI)是使用Class#forName()加载JDBC驱动程序。jdbc驱动程序应该即在DriverManager在静态块内:package com.dbvendor.jdbc;import java.sql.Driver;import java.sql.DriverManager;public class MyDriver implements Driver {     static {         DriverManager.registerDriver(new MyDriver());     }     public MyDriver() {         //     }}调用Class#forName()将执行所有静态初始化器..这条路DriverManager期间,可以通过连接URL在注册的驱动程序中找到关联的驱动程序。getConnection()大致如下:public static Connection getConnection(String url) throws SQLException {     for (Driver driver : registeredDrivers) {         if (driver.acceptsURL(url)) {             return driver.connect(url);         }     }     throw new SQLException("No suitable driver");}但也有婴儿车JDBC驱动程序,从org.gjt.mm.mysql.Driver作为众所周知的示例,它错误地在构造器而不是静态块:package com.dbvendor.jdbc;import java.sql.Driver;import java.sql.DriverManager;public class BadDriver implements Driver {     public BadDriver() {         DriverManager.registerDriver(this);     }}让它动态工作的唯一方法是调用newInstance()之后!否则,您将面临无法解释的“SQLException:没有合适的驱动程序”。再一次,这是虫虫在JDBC驱动程序中,而不是在您自己的代码中。现在,没有一个JDBC驱动程序应该包含这个bug。以便您可以(并且应该)离开newInstance()走开。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java