java中import和class.forName之间的区别

时间:2013-10-30 05:47:08

标签: java jsp jdbc

import和class.forName都会加载类文件。 当我在jsp文件中导入mysql数据的示例时,需要通过class.forName导入驱动程序类。当我通过import语句导入jdbc驱动程序时,它无法从tomcat服务器中的mysql获取数据。

7 个答案:

答案 0 :(得分:8)

1 : import 
==> loads the class when you call any instance of it or call anything by class reference
==> loads the class when call is made

2 : Class.forName("");
==> loads the class in the jvm immediately
可以看出差异 如果一个类有静态块

==> import will not call the static block
==> Class.forName("") will call the static block

在你的情况下

===> Driver class when loaded by Class.forName("") , executes its static block , which published the driver
==> Simply importing the Driver class wont execute the static block and thus your Driver will not be published for connection objects to be created

答案 1 :(得分:0)

Java中的“import”语句允许您访问使用您重要的类或资源。

例如:

import my.package.Utils;

现在,我可以在我正在使用的当前类中访问我的Utils类:

import my.package.Utils;

public static void main(String[] args) {
    Utils.doStuff(); //I can do this because I have access to Utils in my import
}

Class.forName动态加载一个类。这在类可能发生更改的情况下很有用,例如SQL驱动程序实现。 JDBC不知道在编译时要导入哪个类。

调用Class.forName将不允许您在当前正在使用的类中访问它,这是全局导入语句所做的。

使用JDBC,我们可以使用抽象类,例如java.sql.DataSource,它定义了一个数据库。但是,MySQL DataSource和Microsoft SQL DataSource是不同的实现。 JDBC不知道您要使用哪一个。

因此,您使用DriverManager指定要使用MySQL实现的JDBC,并加载该驱动程序的类。

稍后再说切换到Microsoft SQL。现在,您所要做的就是更改DriverManager以加载Microsoft SQL驱动程序的类,并且所有使用抽象java.sql类的代码仍然有效。

答案 2 :(得分:0)

加载了Driver类,因此通过调用Class.forName方法自动向DriverManager注册。这显式加载了驱动程序类。由于它不依赖于任何外部设置,因此建议使用这种加载驱动程序的方式来使用DriverManager框架。以下代码加载类acme.db.Driver:

Class.forName("acme.db.Driver");

如果编写了acme.db.Driver以便加载它会导致创建一个实例,并且还将该实例作为参数调用DriverManager.registerDriver(应该这样做),那么它就在DriverManager的驱动程序列表中并可用于创建连接。

this回答。阅读详细信息。但我猜 import不会在驱动程序管理器下注册驱动程序

答案 3 :(得分:0)

来自文档Class#forName

public static Class<?> forName(String className)
                    throws ClassNotFoundException
  

返回与具有给定字符串名称的类或接口关联的Class对象。调用此方法等同于:

Class.forName(className, true, currentLoader)

其中currentLoader表示当前类的定义类加载器。

例如,以下代码片段返回名为java.lang.Thread的类的运行时类描述符:

Class t = Class.forName("java.lang.Thread")

forName("X")的调用会导致名为X的类被初始化。


来自语言规范jls-7.5

  

导入声明仅在实际包含导入声明的编译单元中通过其简单名称使类型或成员可用。

另一种不太常见的导入形式允许您导入封闭类的公共嵌套类。

答案 4 :(得分:0)

class.forName允许您使用Driver类,而无需为您的类明确导入。这允许您构建项目而无需在类路径中使用jdbc驱动程序。

以及“它无法从mysql中获取数据”的原因,因为您可能无法返回有关jdbc驱动程序类的变量的引用。

希望有所帮助......

答案 5 :(得分:0)

因为你添加了jdbc标签我会回答这个问题。

正如Hussain Akhtar Wahid所说Class.forName("name");调用静态初始化器

java通过DriverManager处理许多SQL驱动程序,而不是为每个驱动程序编写代码,而只需要注册该驱动程序,DriverManger将为您完成工作。

java.mysql.jdbc.Driver calss中的静态初始化程序

static {
      try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
}

通过调用Class.forName("com.mysql.jdbc.Driver");执行的操作是注册DriverManger以告诉我想要访问mysql数据库。

摘录source

答案 6 :(得分:0)

  1. 导入
    当一个正在其短名称中使用的类即将由JVM加载时,“import”短语告诉类加载器在哪里找到该类。因此“import”不会加载任何类,它只是定义类所在的位置。
  2. 的Class.forName()
    立即将类加载并初始化为JVM。
  3. <小时/> BYW:3种加载课程的方式。
    1)使用“新”关键字(加载类+初始化类+新实例)
    Dog d = new Dog();
    2)使用“Class.forName()”(加载类+初始化类)
    Class dogClass = Class.forName("Dog")
    3)使用“classLoader.loadClass()”(加载类)