概述
Class.forName(“类的全称”)
- 不仅表示了类的类类型,还代表了动态加载类
- 需要区分编译、运行
- 编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
使用记事本工具编写一下代码:
class Offic {
public static void main(String[] args) {
if("Word".equals(args[0]))
{
Word w = new Word();
w.start();
}
if("Excel".equals(args[0]))
{
Excel e = new Excel();
e.start();
}
}
}
在cmd中使用javac命令编译程序
不能通过编译。此时Word类和Excel类都不存在。但是Word类和Excel类一定用吗?
现在创建Word类:
class Word{
public static void start()
{
System.out.println("word...start...");
}
}
javac Word.java
javac Office.java
现在只有两个错了,Excel类不存在。
问题是,Word类已经存在了。
假设现在就要用Word类,也不能使用。
原因是,现在的程序做的是静态加载。在编译时刻就需要加载所有的可能使用到的类。
现在希望Word存在Word类就能用。用Excel类的时候, 在告诉我Excel类是找不到的。
如果将来这个程序有很多个功能,只要一个功能有问题,其他的功能就都用不了。这就是编译时加载导致的。new 创建对象都是静态加载类。
我们想要做到的是,主类中用到哪个类就加载哪个类,不用的时候不加载。
通过动态加载类,可以解决该问题。
如何动态加载类呢?
class OfficeBetter{
public static void main(String[] args) {
try{
//动态加载类,在运行时刻
Class c = Class.forName(args[0]);//args[0]就是你用命令行编译运行java程序时,传入的第一个参数
}
catch(Exception e) {
e.printStackTrace();
}
}
}
现在编译不会报错,只有把具体的类传入OfficeBetter类时,才会可能报错。
我们可以看到,编译时没问题,只有在运行时,传入arg[0]具体类名时,才会判断是否正确。
接下来,可以通过类类型,创建该类对象。c.newInstance();然后往具体的类需要做强制转换。但如果直接强转成Word或Excel,这种写死的方式都不好。这里让Word和Excel统一实现一个接口,使用面向接口编程的思想。
class OfficeBetter{
public static void main(String[] args) {
try{
Class c = Class.forName(args[0]);
OfficeAble oa = (OfficeAble)c.newInstance();
oa.start();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
public interface OfficeAble{
public void start();
}
class Word implements OfficeAble{
public void start()
{
System.out.println("word...start...");
}
}
现在想要Excel了,只需把Excel类加上来,并不需要重新编译OfficeBetter这个类。只需要动态的加新的功能。相当于QQ的在线升级,前面的版本不需要删除,不需要重新编译,只需要动态加载新的东西。
class Excel implements OfficeAble{
public void start()
{
System.out.println("excel...start...");
}
}
最后
以上就是着急机器猫为你收集整理的Java反射(二)-Java动态加载类的全部内容,希望文章能够帮你解决Java反射(二)-Java动态加载类所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复