Java反射第二课 动态加载类

来源:互联网 发布:ojbdk是什么意思网络 编辑:程序博客网 时间:2024/05/24 04:19

在第一节课中我们讲的第三种方法

Class.forName("类的全称");

不仅表示了类的类类型,还代表了动态加载类

请大家区分编译,运行

编译时刻加载类是静态加载类,运行时刻加载类是动态加载类

现在的开发工具比如eclipse把编译过程给隐藏了

下面做一个实验

比如用记事本编写下面的Office.Java文件

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. 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. }  

会报错

因为new创建对象是静态加载类,在编译时刻就要加载所有的可能使用到的所有类

现在我们创建World类

这时编译报Exel类找不到(因为我只创建了World没有创建Excel类)。

但是这样是不是有什么问题???

如果我们只想使用Word功能,没有Excel类程序的Word功能也不能使用是不是不太好。如果Office有100个功能,有一个功能有问题,其他99个功能都不能用这样是不是不太好!!!!


因为new创建对象是静态加载类,在编译时刻就要加载所有的可能使用到的所有类

如果我们像要实现用到那个类才加载那个类。没用到就不加载。如何实现?(用到哪部分的功能就去加载对应的代码,没有用到就不加载,这样即使一个功能有问题,其他99个功能照样可以用

其实这就是动态加载类。

如何动态加载类呢?

优化程序:

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class OfficeBetter {  
  2.     public static void main(String[] args) {  
  3.         try {  
  4.             //动态加载类,在运行时刻加载  
  5.             Class c = Class.forName(args[0]);  
  6.             //创建对象  
  7.             //通过类类型创建该类的对象  
  8.             OfficeAble oa = (OfficeAble) c.newInstance();  
  9.             oa.start();  
  10.         } catch (Exception e) {  
  11.   
  12.             e.printStackTrace();  
  13.         }  
  14.     }  
  15. }  

OfficeAble是一个标准,让Word和Excel实现这个接口


[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. interface OfficeAble {  
  2.     public void start();  
  3. }  

这样编译不会有任何问题

如果我要用Word功能,只要让World实现OfficeAble接口就行了

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <pre name="code" class="java" style="font-size:10px;">class Word implements OfficeAble {  
  2.   
  3.     @Override  
  4.     public void start() {  
  5.         // TODO Auto-generated method stub  
  6.         System.out.println("word start");  
  7.     }  
  8.   
  9. }  

如果要添加新的功能,只需要实现officeAble接口就行了,原来的代码不用改

一般功能性的类使用动态加载

比如QQ的在线升级,原来的代码不用变只需要添加新的功能就行了

0 0
原创粉丝点击