2-1 Java动态加载类

来源:互联网 发布:linux命令创建多层目录 编辑:程序博客网 时间:2024/06/05 01:57

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...");    }}

这里写图片描述

原创粉丝点击