Java系统插件开发原理与实例
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系统插件开发原理与实例相关推荐
- Java线程池原理与实例详解
Wiki 采用new Thread的方式产生多线程,可能有以下一些问题: 线程的创建和销毁开销很大,尤其是有些线程的存在时间较短: 线程的创建和销毁过程中伴随着CPU在线程间的切换,开销很大: ...
- java linkedlist实例_Java Linkedlist原理及实例详解
这篇文章主要介绍了Java Linkedlist原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 定义:linkedlist属于链表结构 ...
- redis队列优先级java实现_Redis 实现队列原理的实例详解
Redis 实现队列原理的实例详解 场景说明: ·用于处理比较耗时的请求,例如批量发送邮件,如果直接在网页触发执行发送,程序会出现超时 ·高并发场景,当某个时刻请求瞬间增加时,可以把请求写入到队列,后 ...
- Java虚拟机工作原理详解
原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了 ...
- Java volatile关键字原理解剖
Java volatile关键字原理解剖 文章目录 Java volatile关键字原理解剖 参考文章 前置知识 CPU缓存模型 CPU缓存行 并发编程基本概念 Java锁概念 volatile关键字 ...
- 疯狂涨知识!Java多态实现原理技术总监都拍手叫好
##前言 多态是Java语言重要的特性之一,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定.Java对于方法调用动态绑定的实现主要依赖于方法表,但通过引用调用(invokev ...
- 智能会议系统(3)---Android VoIP系统实现原理
Android VoIP系统实现原理 VoIP(Voice over Internet Protocol)即首先数字化语音信号并压缩成帧,再转换为IP数据包在网络上传输,以此完成语音通话的业务,是一种 ...
- Java虚拟机工作原理具体解释
一.类载入器 首先来看一下java程序的运行过程. 从这个框图非常easy大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘其中.然后你在命令行中输入 javac YourClass ...
- java虚拟机工作原理_Java虚拟机工作原理具体解释
一.类载入器 首先来看一下java程序的运行过程. 从这个框图非常easy大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘其中.然后你在命令行中输入 javac YourClass ...
最新文章
- 构建之法第四章读后感
- 成功解决 AttributeError: module 'tensorflow' has no attribute 'sub'
- 畅通工程 HDU - 1863
- php网站开发期末大作业,大学生期末网页大作业
- 脚本应用实例_Selenium自动化中无头浏览器的应用
- android listview 不显示_Android使用ExpandableListview实现时间轴
- 敏捷开发用户故事系列之五:用户故事的分类
- 零基础学python-如何零基础开始自学Python编程
- dateformat-参数表
- 【读书笔记】终极算法
- Required request body is missing 报错解决
- 计算机专业学生该如何提高自己?提升自己的专业技能?
- 室内三维物体识别与姿态估计--背景
- DC-DC BOOST空载输入电流如何计算?
- struts2 项目构建规划 (6)
- 使用Log日志 计算带宽流量峰值
- 临界区例子及相关函数翻译
- AVPlayer 本地、网络视频播放相关
- SAP寄售采购的原料可以发给加工商做外协加工吗?
- 新闻稿发布内容搜索引擎没有收录,稿件内容优化很重要