单独一句Class.forName ("类名")在数据库驱动时是很常用的,就是让jvm加载驱动类用的。 因为JDBC的DriverManager是个通用的类,显然不可能事先通过硬编码来创建驱动程序的实例,因为它根本不知道用户将使用哪个驱动程序。所以不可能有类似 new com.microsoft.jdbc.sqlserver.SQLServerDriver()这样的代码出现。所以就需要使用DriverManager.getConnection之前调用Class.forName("驱动名")来使JVM加载驱动程序类。
String myClassName = readFromFile ();
MyInteface clazz = Class.forName(myClassName).newInstance ();
这样你可以动态从一个文件创建一个类的实例而不用硬编码在代码里,这样就提供了灵活性。如果你用new关键字的话,只能
MyInteface instance = new MyClass ();你就必须事先知道类的名字。
从JVM的角度讲,使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证这个类已经加载并已经连接。
至于import完全是不同的概念,只是类似于一个声明一样,不会使jvm加载类。
能给我举个小例子吗?
1.做了个接口jk
2.做了个类bb(在aa包中)实现了接口
3.做了个main方法的类中导入了接口,其中写下了
jk clazz=Class.forName("aa.bb").newInstance ();
编译有问题,
改成
jk clazz=Class.forName("aa.bb");
编译有问题
我理解错了?????????
1)Class.forName(...)是运行期,程序运行时装入类并做类的初始化.
2)import仅仅是JAVA编译器在编译程序,并生成目标代码时,将import的类或包中的所有的东西放入"符号表"中,以便编译类时查找到类中的信息.在编译完成后,import的使命也就结束了.与程序运行没有关系的.
*
* MyInterface.java
*
*/
public interface MyInterface
{
void print ();
}/**
*
* MyClass.java
*
*/
public class MyClass implements MyInterface
{ public void print ()
{
System.out.println ("MyClass");
} public static void main (String[] args)
{
try
{
//Use Class.forName
MyInterface clazz = (MyInterface) Class.forName ("MyClass").newInstance ();
clazz.print ();
//Use new
MyInterface clazz1 = new MyClass ();
clazz1.print ();
}
catch (InstantiationException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} }}
import:静态加载不同意,据我了解import只是告诉编译器本文件用到的外部的类去哪个包地下找,只是"告诉"一下,而不会真正的"加载"这个类,当编译器遇到一个不认识的类的时候,会从所有的 import后边的包中寻找这个类,然后加载.类是在用到的时候才会加载,这叫动态加载.
下面这句
MyInterface clazz = (MyInterface) Class.forName ("MyClass").newInstance ();
我是如下写的
MyInterface clazz = Class.forName ("MyClass").newInstance ();
加了(MyInterface)后好用了,谢谢所有帮助我的老师
谢谢啦!!!
Class.forName ("类路径");
这个语句有什么作用呢?
(在连接数据库驱动程序时是这样用的)
因为JDBC的DriverManager是个通用的类,显然不可能事先通过硬编码来创建驱动程序的实例,因为它根本不知道用户将使用哪个驱动程序。所以不可能有类似 new com.microsoft.jdbc.sqlserver.SQLServerDriver()这样的代码出现。所以就需要使用DriverManager.getConnection之前调用Class.forName("驱动名")来使JVM加载驱动程序类。
运行时候把类信息加载进来,会产生一个Class 对象,放到 heap的perm区.
有人说是载入类的,那么与import 导入有什么区别?
improt告诉编译器,这个类里用到的某个类是那个具体的类(package信息),告诉编译器到
哪儿去获得你调用的那个类的方法的信息,这些信息会被编译到你的类里面去.
这么说 如果单独一个语句
Class.forName ("类名");
将产生一个类对象,只是固定的将这个类对象放在了 heap的perm区,
如果要使用这个类对象只要去heap的perm区去取?
heap的perm区是什么,怎么用呢?
是不是很复杂呀?!
如果单独一个语句
Class.forName ("类名");
将产生一个类对象,将这个类对象放在了 heap的perm区,
我知道了heap是内存的自由使用区,动态产生的变量都在此申请到了内存,对吗?
问题是程序中怎么能用到这个动态产生的对象呢?
如果语句是这样的
MyInterface clazz = (MyInterface) Class.forName ("MyClass").newInstance ();
拿着clazz能使用这个对象
是这样的一个单独的语句Class.forName ("类名"); 这个类对象产生了怎么用??????
顺便说一下,在jdbc4.0中应该已经不需要通过Class.forName来加载driver了,它加入了自动发现机制。你可以参考一下jdk6.0的javadoc。
而Class.forname,是自己强制得去加载,不管这么类使用不使用
看来我要学的东西还很多,
引用楼主 dbky50 的帖子:
谁能告诉我一下Class.forName("")方法的用处
有人说是用来载入类的,那么与import 导入有什么区别? 答:两者概念上完全不同
1)Class.forName(...)是运行期,程序运行时装入类并做类的初始化.
2)import仅仅是JAVA编译器在编译程序,并生成目标代码时,将import的类或包中的所有的东西放入"符号表"中,以便编译类时查找到类中的信息.在编译完成后,import的使命也就结束了.与程序运行没有关系的.
//加载驱动
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
//获取连接
conn=DriverManager.getConnection("jdbc:db2:books");
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
加载数据库的驱动用的,每个数据库都有一个jar的包,就是调用里面的class文件
这个是连接db2数据据的语句!
import 是用来导入其他包中的类文件用的
如果不导入
在当前包下是找不到的!