对,第一句是最好的。
第一句这个方法是按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类已经被加载过,则返回代表该Class的实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出ClassNotFoundException。加载完这个Class字节码后,接着就可以使用Class字节码的newInstance方法去创建该类的实例对象了。
有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时才能确定,这时候就需要使用Class.forName去动态加载该类,这个类名通常是在配置文件中配置的,框架的设计原理就是建立反射基础上的
下面是模拟的一个小框架例子,希望可以帮助你理解
import java.io.InputStream;
import java.util.Collection;
import java.util.Properties;
public class Demo {
public static void main(String[] args) throws Exception {
//加载一个properties文件
InputStream fis = Demo.class.getResourceAsStream("config.properties");
Properties prop = new Properties();
prop.load(fis);
fis.close();
String className = prop.getProperty("className"); //通过Key,拿到相对应的value
//通过反射,拿到的是这个配置文件中的className的实例
Collection collection = (Collection)Class.forName(className).newInstance();
ReflectPoint p1 = new ReflectPoint(3,3);
ReflectPoint p2 = new ReflectPoint(5,5);
ReflectPoint p3 = new ReflectPoint(3,3);
collection.add(p1);
collection.add(p2);
collection.add(p3);
System.out.println(collection.size());
}
}
|