风也温柔

计算机科学知识库

java 动态加载jar包-动态加载类

  最近在成都写一个移动增值项目,俺负责后台端。功能很简单,手机用户通过GPRS打开与服务器连接,我则根据用户传过来的数据做出响应。做过类似项目的兄弟一定都知道,首先需要定义一个类似于MSNP的通讯协议,不过今天的话题是如何把这个系统设计得具有高度的扩展性。由于这个项目本身没有进行过较为完善的客户沟通和需求分析,所以以后肯定会有很多功能上的扩展,通讯协议肯定会越来越庞大,而我作为一个不那么勤快的人,当然不想以后再去修改写好的程序,所以这个项目是实践面向对象设计的好机会。

  首先定义一个接口来隔离类:

  ..;

  tor

  {

  .util.(java.util.)

  }

  根据设计模式的原理java 动态加载jar包-动态加载类,我们可以为不同的功能编写不同的类,每个类都继承接口,客户端只需要针对接口编程就可以避免很多麻烦。比如这个类:

  ...*;

  {

  .util.(java.util.)

  {

  =();

  .add((“操作成功”));

  ;

  }

  }

  我们还可以写其他很多类,但是有个问题java 动态加载jar包,接口是无法实例化的,我们必须手动控制具体实例化哪个类,这很不爽,如果能够向应用程序传递一个参数,让自己去选择实例化一个类,执行它的act方法,那我们的工作就轻松多了。

  很幸运,我使用的是Java,只有Java才提供这样的反射机制,或者说内省机制,可以实现我们的无理要求。编写一个配置文件emp.:

  #成功响应

  1000=

  #向客户发送普通文本消息

  2000=Load

  #客户向服务器发送普通文本消息

  3000=Store

  文件中的键名是客户将发给我的消息头,客户发送1000给我,那么我就执行类的act方法,类似的如果发送2000给我,那就执行Load类的act方法,这样一来系统就完全符合开闭原则了java 动态加载jar包,如果要添加新的功能,完全不需要修改已有代码,只需要在配置文件中添加对应规则,然后编写新的类,实现act方法就ok,即使我弃这个项目而去,它将来也可以很好的扩展。这样的系统具备了非常良好的扩展性和可插入性。

  下面这个例子体现了动态加载的功能,程序在执行过程中才知道应该实例化哪个类:

  ...*;

  .lang..*;

  ct

  {

  //加载配置文件,查询消息头对应的类名

  tocal()

  {

  =null;

  try

  {

  =();

  =("emp.");

  prop.load(fis);

  =prop.();

  fis.close();

  }catch()

  {

  .out.(e);

  }

  ;

  }

  //针对消息作出响应,利用反射导入对应的类

  (,)

  {

  =null;

  =null;

  try

  {

  /*

  *导入属性文件emp.,查询所对应的类的名字

  *通过反射机制动态加载匹配的类,所有的类都被接口隔离

  *可以通过修改属性文件、添加新的类(继承接口)来扩展协议

  */

  s="org..."+this.();

  //加载类

  =Class.(s);

  //创建类的事例

  =()c.();

  //构造参数列表

  []=[1];

  [0]=Class.("java.util.List");

  //查询act方法

  =c.("act",);

  []=[1];

  args[0]=;

  //调用方法并且获得返回

  =m.(mo,args);

  }catch()

  {

  .out.("-:"+e);

  }

  ;

  }

  ([])

  {

  =();

  tr.(args[0],”消息内容”);

  }

  }

  测试一下:

  这个程序是针对编程的,所以无需做任何修改,直接提供Load和Store类,就可以支持2000、3000做参数的调用。

  有了这样的内省机制,可以把接口的作用发挥到极至,设计模式也更能体现出威力

  文章来源:https://javaee.cc/post/33352694.html