Java动态加载类

一、Class 类

Class.forName("类的全称")

  • 不仅表示类的类类型,还代表了动态加载类
  • 请大家区分编译、运行
  • 编译时刻加载类是静态加载类、运行时刻加载类是动态加载类

 

 

二、静态加载类

1、我们看下面这段代码,通过 new 的方式来创建对象,这其实是静态方式来加载类(Word和Excel)

  1. public class Office {
  2.     public static void main(String args[]) {
  3.         if("Word".equals(args[0])) {
  4.             Word w = new Word();
  5.             w.start();
  6.         }
  7.         if("Excel".equals(args[0])) {
  8.             Excel e = new Excel();
  9.             e.start();
  10.         }
  11.     }
  12. }

如上代码,目前是没有 Word 和 Excel 两个类,我们编译程序

结果如下

Java动态加载类

可见,因为我们没有 Word 和 Excel 类,自然也没有 start 方法,报了四个错误。

 

2、我们创建 一个 Word 类

  1. public class Office {
  2.     public static void main(String args[]) {
  3.         if("Word".equals(args[0])) {
  4.             Word w = new Word();
  5.             w.start();
  6.         }
  7.         if("Excel".equals(args[0])) {
  8.             Excel e = new Excel();
  9.             e.start();
  10.         }
  11.     }
  12. }
  13. class Word {
  14.     public void start() {
  15.         System.out.println("start word...");
  16.     }
  17. }

再次编译,结果如下

Java动态加载类

这次只报了两个错误了,显示 Excel 类和其对象的 start() 方法不存在

 

3、结论

使用 new 创建对象的方式,是静态加载类,编译阶段,就会加载可能要用到类,如果不存在就报错,无法通过编译。

如上,第2中的例子,Word 类存在,Excel 不存在,导致 Word 类也用不了。

我们当然希望,Word 类存在 Word 就能用,用 Excel 的时候发现 Excel 类不存在再报错吧。

如果将来我们有100个功能,有一个功能有问题,其他99个也用不了,十分不好。

这就是编译时加载导致的,静态加载类。

我们希望,用的时候再加载类,不用不加载,动态加载类可以实现。

 

三、使用动态加载的方式

1、 OfficeAble.java  定义规范的接口

  1. public interface OfficeAble {
  2.     void start();
  3. }

2、Word.java  实现 OfficeAble 接口

  1. public class Word implements OfficeAble {
  2.     public void start() {
  3.         System.out.println("start word...");
  4.     }
  5. }

3、Excel.java   实现 OfficeAble 接口

  1. public class Excel implements OfficeAble {
  2.     @Override
  3.     public void start() {
  4.         System.out.println("start excel...");
  5.     }
  6. }

4、OfficeBetter.java

  1. public class OfficeBetter {
  2.     public static void main(String args[]) {
  3.         try {
  4.             //动态加载类,在运行的时候加载类
  5.             Class c = Class.forName(args[0]);
  6.             //通过类类型
  7.             OfficeAble oa = (OfficeAble) c.newInstance();
  8.             oa.start();
  9.         } catch (ClassNotFoundException e) {
  10.             e.printStackTrace();
  11.         } catch (IllegalAccessException e) {
  12.             e.printStackTrace();
  13.         } catch (InstantiationException e) {
  14.             e.printStackTrace();
  15.         }
  16.     }
  17. }

 

然后我们在终端依次编译 Word类,Excel 类,OfficeBetter类

再运行 Office类,带 Word 参数

再运行 OfficeBtter类,带 Excel 参数

Java动态加载类

同时,已经编译的,生成了.class 文件,下次就可以直接运行了,而不需要重新编译,这就是所谓的“一次编译,到处运行”。

一般情况,软件升级也是如此,只需要编译需要新的功能,而之前的功能也可以正常使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半缘修道半缘君丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值