Class.forName是干什么的?书上说可以用它来动态加载类,文档好像是说它返回一个Class类 同上 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 类是程序的一部分,每个类都有一个Class对象,即每当编写并且编译了一个新类,就会产生一个Class对象,在运行时,当我们想生成这个类的对象时,运行这个程序的jvm会首先检查这个类的Class对象是否已经加载,如未加载,jvm就会根据类名查找 .class文件,并将其载入.而Class.forName("A")不仅产生class对象而且有个副作用:如果类A没有被加载,就加载它! Class.forName("A"); //如果A没有被加载,加载它,是不是相当于生成一个A的实例。 Class.forName("A"); //如果A没有被加载,加载它,是不是相当于生成一个A的实例。不是,只是加载了类,也就是说static初始化这时会进行. 没有生成实例,如果要生成实例要用Class.forName("A").newInstance(); rumlee(rum-lee)补充的是正确的。我也这样认为。 回复人: interhanchi(艰难困苦,玉汝于成!) ( ) 信誉:105 2005-08-28 13:35:00 得分: 0 说得对!副作用倒没有什么,返回的是一个Class 对象,但不同于 实列化一个类 Class.forName("A");Class.forName("A").newInstance();这两种方法经常看到我还看到过一种这样直接加载的(也不知道算不算)new A很简单吧 :)可是也可以正常运行的啊 new A你知道类名是A当然直接new了假如有很多类名,需要动态,比如在一个数组里放了很多数组名(string),你怎么new啊 "new A你知道类名是A当然直接new了假如有很多类名,需要动态,比如在一个数组里放了很多数组名(string),你怎么new啊"(引用楼上的话)我有些不解,如果想NEW一个类的实例的话用你说的例子如果一个数组 有很多数组名的话,直接NEW 这个数组本身不就可以了么? NEW完数组本身,不就可以调用里面的那些数组名了么?请楼上的帮忙回答一下,谢谢~ 学了设计模式你就知道为什么要运行期动态加载了。最常用的例子就是数据库连接一般数据库连接是从系统配制文件中加载的,事先不知要加载的是那个数据库,所以要动态加载。另外还有其它的法,比如对于一个对象,如果对象属性为a则加载ClassA,属性为B则加载ClassB,用这种方法比用if else可读性与拓展性都强得多。 Class.forName("A").newInstance();A必须有一个无参构造子 Class.forName("A");Class.forName("A").newInstance();这两种方法有什么不同吗?在连接数据库的时候都可以用的呀 "new A你知道类名是A当然直接new了假如有很多类名,需要动态,比如在一个数组里放了很多数组名(string),你怎么new啊"(引用楼上的话)我有些不解,如果想NEW一个类的实例的话用你说的例子如果一个数组 有很多数组名的话,直接NEW 这个数组本身不就可以了么? NEW完数组本身,不就可以调用里面的那些数组名了么?请楼上的帮忙回答一下,谢谢~-------------------------String klasses[] = {"classA","classB","classC","classD"};假如你要的是其中一个class的实例,但你不知道具体是哪个,此时可能这样Class.forName(klasses[index]).newInstance();这里你不能用new classA()这样,因为哪个是不确定的,也就是动态的 若在class A中调用Class.forName("B");那么只有当class B可以通过加载A的classloader加载时,才有效。用JVM的术语讲,A和B将处于同一命名空间,否则forName发出ClassNotFoundException, 即使你指定classpath也不行。 JDialog 关于JAVA 中容器的equals方法 与hashCode()方法,请帮忙看看。 初学java 关于在netbeans中遇到的找不到变量符号问题 关于数据类型 问一个让我郁闷一整天的问题!!! 请问如何调用JSP页面呀(高手请进,急着呢) 如何在JTextArea中输入一个回车? 如何选中用JTable创建的表格的某一行? 真么没有人回答我的问题啊;呜呜 java volatile使用的问题 特别奇怪的的问题 大家都来发表一下意见 经常碰到“堆栈”,但“堆”和“栈”的作用又不一样,那么“堆栈”到底是“堆”还是“栈”?
Class.forName("A").newInstance();
这两种方法经常看到我还看到过一种这样直接加载的(也不知道算不算)
new A很简单吧 :)
可是也可以正常运行的啊
假如有很多类名,需要动态,比如在一个数组里放了很多数组名(string),你怎么new啊
假如有很多类名,需要动态,比如在一个数组里放了很多数组名(string),你怎么new啊
"
(引用楼上的话)
我有些不解,如果想NEW一个类的实例的话
用你说的例子
如果一个数组 有很多数组名的话,直接NEW 这个数组本身不就可以了么? NEW完数组本身,不就可以调用里面的那些数组名了么?
请楼上的帮忙回答一下,谢谢~
最常用的例子就是数据库连接
一般数据库连接是从系统配制文件中加载的,事先不知要加载的是那个数据库,所以要动态加载。
另外还有其它的法,比如对于一个对象,如果对象属性为a则加载ClassA,属性为B则加载ClassB,用这种方法比用if else可读性与拓展性都强得多。
A必须有一个无参构造子
Class.forName("A").newInstance();
这两种方法有什么不同吗?
在连接数据库的时候都可以用的呀
假如有很多类名,需要动态,比如在一个数组里放了很多数组名(string),你怎么new啊
"
(引用楼上的话)
我有些不解,如果想NEW一个类的实例的话
用你说的例子
如果一个数组 有很多数组名的话,直接NEW 这个数组本身不就可以了么? NEW完数组本身,不就可以调用里面的那些数组名了么?
请楼上的帮忙回答一下,谢谢~-------------------------
String klasses[] = {"classA","classB","classC","classD"};
假如你要的是其中一个class的实例,但你不知道具体是哪个,此时可能这样Class.forName(klasses[index]).newInstance();
这里你不能用new classA()这样,因为哪个是不确定的,也就是动态的
Class.forName("B");那么只有当class B可以通过加载A的classloader加载时,才有效。用JVM的术语讲,A和B将处于同一命名空间,否则forName发出ClassNotFoundException, 即使你指定classpath也不行。