java系统的插件开发,类似  系统中定义一个 接口,给插件的开发者,然后开发者按照实现该接口后,打包成jar(zip) 上传到系统中,并告知系统实现类的名字,然后系统就能调用该插件了。

该实现方法用到了 java动态加载 类的技术,主要是ClassLoader。

下面 我们模拟 一个场景

一个系统  提供一个打印功能,其接口是IPrinter。该系统 已经实现了 老式打印机OldPrinterImpl。

现在第三方 拿到 IPrinter 接口后 开发出了 ColorPrinterImpl 彩色打印的功能。并打成了插件zip(jar)包,上传到了 系统,并告知系统打印使用ColorPrinterImpl 。

代码如下:

本系统中的代码

IPrinter.java

package com.iccboy.study.plugin.api;/*** 打印接口* * @author iccboy*/
public interface IPrinter {/*** 打印* @param msg 内容* @return 打印值*/String print(String msg);}

OldPrinterImpl.java

package com.iccboy.study.plugin.myimpl;import com.iccboy.study.plugin.api.IPrinter;/*** 照片打印* @author iccboy**/
public class OldPrinterImpl implements IPrinter {@Overridepublic String print(String msg) {return "这是老式打印机打印出的内容:" + msg;}}

Client.java

package com.iccboy.study.plugin;import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;import com.iccboy.study.plugin.api.IPrinter;
import com.iccboy.study.plugin.myimpl.OldPrinterImpl;/*** 场景类* @author iccboy**/
public class Client {public static void main(String[] args) {IPrinter print = new OldPrinterImpl();String msg = print.print("枯藤老树昏鸦,古道西风瘦马");System.out.println(msg);print = getPrinter("com.iccboy.study.plugin.otherimpl.ColorPrinterImpl");System.out.println(print.print("沉舟侧畔千帆过,病树前头万木春"));}/*** 获得插件中的实现* @param className* @return*/public static IPrinter getPrinter(String className) {String class_path = className;//Jar中的所需要加载的类的类名String jar_path = "D:\\case\\java\\plugin\\colorpinter.zip";//jar所在的文件的URLtry {ClassLoader cl = new URLClassLoader(new URL[]{new File(jar_path).toURI().toURL()});//从Jar文件得到一个Class加载器Class<?> c = cl.loadClass(class_path);//从加载器中加载ClassIPrinter sif = (IPrinter) c.newInstance();//从Class中实例出一个对象return sif;} catch (Exception e) {e.printStackTrace();}return null;}
}

接下来,我们把IPrinter.java 接口类  分发给插件开发者,插件开发者 将 接口导入自己的项目中,然后实现该接口。然后导出为jar或者zip,把包给系统,使用方法如上面的Client.java类。

插件项目printer-plugin

ColorPrinterImpl.java

package com.iccboy.study.plugin.otherimpl;import com.iccboy.study.plugin.api.IPrinter;/*** * 彩色打印机  插件实现* @author iccboy**/
public class ColorPrinterImpl implements IPrinter {@Overridepublic String print(String msg) {return "这是彩色打印机打印出的内容:" + msg + "\r\n" +new OtherClass().getSoming();}}

OtherClass.java

package com.iccboy.study.plugin.otherimpl;/*** 插件中的其它类* @author iccboy**/
public class OtherClass {public String getSoming() {return "这是插件其它类中的数据";}
}
然后打包
这是老式打印机打印出的内容:枯藤老树昏鸦,古道西风瘦马
这是彩色打印机打印出的内容:沉舟侧畔千帆过,病树前头万木春
这是插件其它类中的数据
最终运行结果是:
---------------------------------
这是老式打印机打印出的内容:枯藤老树昏鸦,古道西风瘦马
这是彩色打印机打印出的内容:沉舟侧畔千帆过,病树前头万木春
这是插件其它类中的数据
---------------------------------


Java系统插件开发原理与实例相关推荐

  1. Java线程池原理与实例详解

    Wiki 采用new Thread的方式产生多线程,可能有以下一些问题:  线程的创建和销毁开销很大,尤其是有些线程的存在时间较短:  线程的创建和销毁过程中伴随着CPU在线程间的切换,开销很大: ...

  2. java linkedlist实例_Java Linkedlist原理及实例详解

    这篇文章主要介绍了Java Linkedlist原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 定义:linkedlist属于链表结构 ...

  3. redis队列优先级java实现_Redis 实现队列原理的实例详解

    Redis 实现队列原理的实例详解 场景说明: ·用于处理比较耗时的请求,例如批量发送邮件,如果直接在网页触发执行发送,程序会出现超时 ·高并发场景,当某个时刻请求瞬间增加时,可以把请求写入到队列,后 ...

  4. Java虚拟机工作原理详解

    原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了 ...

  5. Java volatile关键字原理解剖

    Java volatile关键字原理解剖 文章目录 Java volatile关键字原理解剖 参考文章 前置知识 CPU缓存模型 CPU缓存行 并发编程基本概念 Java锁概念 volatile关键字 ...

  6. 疯狂涨知识!Java多态实现原理技术总监都拍手叫好

    ##前言 多态是Java语言重要的特性之一,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定.Java对于方法调用动态绑定的实现主要依赖于方法表,但通过引用调用(invokev ...

  7. 智能会议系统(3)---Android VoIP系统实现原理

    Android VoIP系统实现原理 VoIP(Voice over Internet Protocol)即首先数字化语音信号并压缩成帧,再转换为IP数据包在网络上传输,以此完成语音通话的业务,是一种 ...

  8. Java虚拟机工作原理具体解释

    一.类载入器 首先来看一下java程序的运行过程. 从这个框图非常easy大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘其中.然后你在命令行中输入 javac YourClass ...

  9. java虚拟机工作原理_Java虚拟机工作原理具体解释

    一.类载入器 首先来看一下java程序的运行过程. 从这个框图非常easy大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘其中.然后你在命令行中输入 javac YourClass ...

最新文章

  1. 构建之法第四章读后感
  2. 成功解决 AttributeError: module 'tensorflow' has no attribute 'sub'
  3. 畅通工程 HDU - 1863
  4. php网站开发期末大作业,大学生期末网页大作业
  5. 脚本应用实例_Selenium自动化中无头浏览器的应用
  6. android listview 不显示_Android使用ExpandableListview实现时间轴
  7. 敏捷开发用户故事系列之五:用户故事的分类
  8. 零基础学python-如何零基础开始自学Python编程
  9. dateformat-参数表
  10. 【读书笔记】终极算法
  11. Required request body is missing 报错解决
  12. 计算机专业学生该如何提高自己?提升自己的专业技能?
  13. 室内三维物体识别与姿态估计--背景
  14. DC-DC BOOST空载输入电流如何计算?
  15. struts2 项目构建规划 (6)
  16. 使用Log日志 计算带宽流量峰值
  17. 临界区例子及相关函数翻译
  18. AVPlayer 本地、网络视频播放相关
  19. SAP寄售采购的原料可以发给加工商做外协加工吗?
  20. 新闻稿发布内容搜索引擎没有收录,稿件内容优化很重要

热门文章

  1. 视觉SLAM14讲笔记分享——第四章【李群与李代数】
  2. 树模型(一):预备知识
  3. python使用smtplib群发工资条的两种方式(及群发只成功一条的问题)
  4. Graham扫描法求解二维凸包问题
  5. [SCOI2014]方伯伯的玉米田
  6. 【Unity】让动画系统支持相对坐标
  7. linux里进程状态为sl,Linux ps state sl+是什么意思
  8. 桂电计算机系入学怎么分班,桂电研究生-()学期课程总表.doc
  9. AcWing 188. 武士风度的牛
  10. Blazor预研与实战