为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人8056858 2019-08-03 07:03:14
“Class.forName()”和“Class.forName().newInstance()”之间有什么区别?.之间的区别是什么?Class.forName()和Class.forName().newInstance()?我不明白其中的重大区别(我读过一些关于它们的文章)。你能帮帮我吗?
查看完整描述

3 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

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



查看完整回答
反对 回复 2019-08-05
?
偶然的你

TA贡献1841条经验 获得超3个赞

在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()走开。




查看完整回答
反对 回复 2019-08-05
  • 3 回答
  • 0 关注
  • 269 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信