站内搜索: 请输入搜索关键词

当前页面: 开发资料首页JSP 专题有关class.forname调用的一个问题?

有关class.forname调用的一个问题?

摘要: 有关class.forname调用的一个问题?


诸位高人:
我正学习JDBC,我发现这样一个问题:通过class.forname装载驱动程序时,直接使用:
Class.forName("......");的形式,我的JSP也以正常运行,可在不少参考书中,都是以:
Class.forName("......").newInstance();的形式调用的
请问:两者有何区别?newInstance()究竟有何用?




楼主直接查看forName()的java doc比我说要清楚,我无非也是把java doc再复述一次。


楼上:
doc文档,我看了,但仍然不清楚,那里好像只提到newInstance是创建某类的新实例,因此我觉得仅看doc文档,仍不能解答我原帖中的问题.



newInstance()应用反射机制创建类的实例,察看反射API,说的挺清楚。不过我感觉这两种方式没区别


不检查抛出的任何异常,包括已检查的异常。
使用此方法可以有效地绕过编译时的异常检查,而在其他情况下编译器都会执行该检查。

如果有更好的解释请跟贴,我们讨论一下。


还是搞不明白:
既然Class.forName("......");与Class.forName("......").newInstance();能有同样的运行结果,那有什么必要用后者?


这两个方法完全不一样,他们的运行结果更是完全不一样。
forName()返回一个Class对象,newInstance()根据返回的Class对象创建一个该对象的实例。
即使不看代码也能从他们各自的异常看出两个方法的行为的不用,forName()不调用构造函数,newInstance()会调用构造函数。
至于别的差别,可以去看代码。


运行这个类可以很明显的看出两个方法产生的是不同的对象。

public class test {
static class ex{
String str = "asdf";
public String toString()
{
return str;
}
}
public static void main(String[] args)
{
a();
b();
}
private static void a()
{
try {
Class c = (Class) Class.forName("test$ex");
System.out.println(c);
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
}

private static void b()
{
try {
ex d = (ex) Class.forName("test$ex").newInstance();
System.out.println(d);
} catch (InstantiationException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
}
}


↑返回目录
前一篇: 求教JSP页面中文件下载的错误问题
后一篇: jsp如何将数据以excel导出