国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Java動態(tài)加載與插件開發(fā)研究

2015-05-30 09:35:42錢宇虹
關(guān)鍵詞:插件

摘 要:本文首先研究了Java語言的動態(tài)加載方式和實現(xiàn)插件化的方法, 并以支持不同音頻格式的音樂播放器為例展示了Java插件的開發(fā)步驟。本文所展示的Java插件的開發(fā)方法和步驟具有一般性指導(dǎo)意義,可以很好地解決新功能植入或著功能模塊定制問題。

關(guān)鍵詞:動態(tài)加載;Java 插件;功能植入;模塊定制

1 概述

軟件項目開發(fā)經(jīng)常會遇到這樣的情況發(fā)生,就是當(dāng)項目開發(fā)結(jié)束并交付使用后,需要增加一些新功能。我們通常希望在不改變原有應(yīng)用程序代碼的前提下,將新增加的功能植入到系統(tǒng)中。

還有一種情況就是針對同一個功能模塊,不同用戶會要求不同的具體實現(xiàn)。例如,呼叫中心坐席軟件中的來電彈屏功能,不同用戶可能要求展示客戶信息的方式不一樣,信息來源不一樣,有的甚至要求完成一些額外的功能。這就是所謂的功能模塊定制。

不管是新功能植入,還是功能模塊定制,我們都可以使用插件化技術(shù)來解決。新增加的功能模塊,或者被定制的功能模塊,被

稱為插件。插件化技術(shù)帶來的好處直接體現(xiàn)為降低了模塊之間的耦合性,便于各個模塊的獨(dú)立維護(hù),方便和加快整個項目的維護(hù)更新。

Java語言的動態(tài)加載技術(shù)完美的支持了插件化開發(fā)。本文首先研究了Java語言的動態(tài)加載方式和實現(xiàn)插件化的方法,并以支持不同音頻格式的音樂播放器為例展示了Java插件的開發(fā)步驟。

2 Java動態(tài)加載并實例化的幾種方式

Java程序運(yùn)行時是需要把類加載到內(nèi)存的。Java類的加載方式有兩種:隱式加載和顯式加載。隱式加載是通過new的方式,如:Person person=new Person(),在類初始化時由Java虛擬機(jī)根據(jù)相應(yīng)的類加載器(ClassLoader)將類載入[1]。顯式加載則是程序員在代碼中顯式地利用某個類加載器將類載入。顯示加載并實例化類又可以通過下面兩種方法:

2.1 使用Class類[1]

在Java中通過Class類的靜態(tài)方法forName()可以動態(tài)加載一個指定的類(需要提供類的完整名字),然后調(diào)用newInstance()就可以構(gòu)造一個該類的實例,例如:String className = "com.abc.Person";

Person person=Class.forName(className).newInstance();

這個功能對于相同接口的不同實現(xiàn)具有重大意義。我們可以定義一個接口,然后提供好幾個該接口的實現(xiàn)類,用戶通過修改配置文件來指定實際使用哪一個實現(xiàn)類,然后在源碼中讀取配置文件,就可以構(gòu)造一個指定實現(xiàn)類的實例而不用每次修改源碼。通過這種方法,系統(tǒng)只要關(guān)心接口的定義,用戶只要進(jìn)行配置文件的設(shè)置,就完成了同一功能不同實現(xiàn)的任意切換。

2.2 使用ClassLoader

這種方法需要首先獲得ClassLoader,然后通過ClassLoader的loadClass ()方法動態(tài)加載一個指定的類。Java提供了以下三種途徑得到ClassLoader:

·使用系統(tǒng)類加載器:ClassLoader.getSystemClassLoader();

·使用當(dāng)前類加載器:this.getClass.getClassLoader();

·使用當(dāng)前線程類加載器:Thread.currentThread().getContextClassLoader();

下面的代碼片段展示了如何使用系統(tǒng)類加載器裝載并實例化的過程:

ClassLoader cloader = ClassLoader.getSystemClassLoader();

Class cls = cloader.loadClass("com.abc.Person");

Person person = (Person)cls.newInstance();

需要注意的是:系統(tǒng)類加載器處理-classpath下的類加載工作,它適合于簡單的命令行應(yīng)用,如果是EJB, 或java Web應(yīng)用,請使用其他的類加載器。

3 Java 插件的開發(fā)(Java Plugin development)

下面考慮這樣一種應(yīng)用場景:現(xiàn)有用Java語言編寫的主程序,要求第三方開發(fā)人員編寫擴(kuò)展功能。約定第三方開發(fā)人員開發(fā)的類必須包含一個實現(xiàn)某已知接口的類,名稱不限。要求第三方開發(fā)的類打成 jar包,與主程序分開發(fā)布。jar包放在主程序安裝目錄下的plugins子目錄下,主程序啟動時動態(tài)加載 jar 包中的類。

這是典型的Java插件技術(shù)在實際應(yīng)用中的體現(xiàn)。為了開發(fā)java插件,java提供了URLClassLoader解決從jar文件中動態(tài)加載類。 URLClassLoader是ClassLoader的子類,它用于從指定的jar文件和目錄的URL搜索路徑加載類和資源,即,通過URLClassLoader就可以加載指定jar中的類到內(nèi)存中[2]。下面的代碼片段說明了這一過程:

// 動態(tài)加載jar包

String url_str = "file:C:\PluginDemo\plugins\WMAPlayer.jar";

URL[] urls = new URL[1];

urls[0] = new URL(url_str);

URLClassLoader loader = new URLClassLoader(urls);

//從加載器中加載插件類,然后實例出一個對象

Class<?> c = loader.loadClass("com.abc.plugin.WMAPlayer");

PlayerIface ?instance = (PlayerIface) c.newInstance();

在插件開發(fā)過程中,首先由開發(fā)人員編寫系統(tǒng)框架,并預(yù)先定義好系統(tǒng)的擴(kuò)展接口。插件由其他開發(fā)人員(或第三方開發(fā)人員)根據(jù)預(yù)先定義好的接口編寫系統(tǒng)的擴(kuò)展功能模塊。插件以獨(dú)立的jar 包形式出現(xiàn)。對系統(tǒng)而言,它并不知道也不可能知道插件的具體實現(xiàn),它所做的就是為插件預(yù)定義好接口。系統(tǒng)啟動的時候根據(jù)配置文件尋找插件,并根據(jù)預(yù)定義接口將插件掛接到系統(tǒng)中。插件的基本結(jié)構(gòu)如圖1所示。

圖中,MANIFEST.MF是每個插件的描述文件,應(yīng)用程序加載插件時首先解析每個插件的描述文件,然后在應(yīng)用程序中動態(tài)加載類并實例化,最后調(diào)用類的方法。具體而言,將每個插件打成 jar包,里面包含一個實現(xiàn)預(yù)定義接口的類,在jar的MANIFEST.MF文件中給出該類的全路徑。在應(yīng)用程序中使用URLCLassLoader裝載jar包,使用java.util.jar.JarFile和java.util.jar.Manifest解析jar包和MANIFEST.MF文件[3],獲得插件類以后用URLCLassLoader的loadClass()方法裝載類,最后使用newInstance()創(chuàng)建該類的實例。

圖1 ?插件的基本結(jié)構(gòu)

下面以音樂播放器為例,具體展示Java插件的開發(fā)過程。本例將支持不同音頻格式的音樂播放器做成不同的插件。

第一步:預(yù)定義系統(tǒng)的擴(kuò)展接口。

package com.abc.demo;

public interface PlayerIface{

public void load(String filename);

public void play();

public void stop();

public String getSupportedFormat();

}

第二步:編寫實現(xiàn)擴(kuò)展接口的插件類。

下面是MP3播放器插件類,插件類實現(xiàn)了擴(kuò)展接口PlayerIface,并且必須擁有不帶參數(shù)的構(gòu)造方法,以便實例化時被調(diào)用。用同樣的方法可以編寫其他音頻格式的播放器。

package com.abc.plugin;

public class MP3Player implements PlayerIface{

//實現(xiàn)接口中的方法,代碼略。

}

第三步:編寫自己的MANIFEST.MF文件,其中有一個Plugin-Class屬性,指定了插件類的完整類名。文件內(nèi)容如下:

Manifest-Version: 1.0

Plugin-Class: com.abc.plugin.MP3Player

第四步:將插件類com.abc.plugin. MP3Player打成MP3Player.jar包,打包時注意將上述MANIFEST.MF文件打入包中。

第五步:將jar包發(fā)布在主程序的安裝目錄的子目錄中,一般是plugins子目錄。

如圖2所示。

圖2 ?插件的發(fā)布目錄

第六步:主程序啟動時在plugins子目錄中列舉所有插件,針對每個jar包解析其中的MANIFEST文件,提取Plugin-Class屬性的值,獲取插件類的完整類名。用URLCLassLoader的loadClass()方法裝載該類,最后使用newInstance()創(chuàng)建該類的實例。

4 結(jié)束語

本文所展示的Java插件的開發(fā)方法和步驟具有一般性指導(dǎo)意義,可以很好地解決新功能植入或功能模塊定制。作者最近在一個呼叫中心的坐席軟件中就是利用Java插件技術(shù)解決了來電彈屏定制問題。正因為插件技術(shù)降低了模塊之間的耦合性,便于各個模塊的獨(dú)立維護(hù),方便和加快整個項目的維護(hù)更新,可以在不修改原有應(yīng)用程序代碼的情況下植入新的功能,或者完成某個功能模塊的定制,從而在軟件項目開發(fā)中得到廣泛的應(yīng)用。

參考文獻(xiàn):

[1]Java:靜態(tài)和動態(tài)類加載[EB/OL].http://javaj2ee.com/node/14.

[2]動態(tài)類加載[EB/OL]. https://en.wikibooks.org/wiki/Java_Programming/

Reflection/Dynamic_Class_Loading.

[3]Java程序:從jar 包讀取manifest文件[EB/OL], https://blogs.oracle.com/jmxetc/entry/a_java_program_that_reads.

作者簡介:

錢宇虹(1967-),女,計算機(jī)科學(xué)碩士,副教授,研究領(lǐng)域:軟件開發(fā)與應(yīng)用、軟件工程、軟件測試技術(shù)。

猜你喜歡
插件
自編插件完善App Inventor與樂高機(jī)器人通信
電子制作(2019年22期)2020-01-14 03:16:34
基于jQUerY的自定義插件開發(fā)
軟件(2016年6期)2017-02-06 00:28:36
MapWindowGIS插件機(jī)制及應(yīng)用
基于Revit MEP的插件制作探討
Firefox 26無法使用第三方插件的解決
電腦迷(2014年2期)2014-04-29 19:21:13
火力加強(qiáng)再加強(qiáng)IE插件三劍客
彰武县| 菏泽市| 花莲县| 七台河市| 大田县| 石河子市| 乐业县| 杭州市| 洛扎县| 双桥区| 凌源市| 澄迈县| 合水县| 松溪县| 博兴县| 溆浦县| 盐亭县| 甘德县| 昌黎县| 岢岚县| 左云县| 玉龙| 五家渠市| 富宁县| 马关县| 岳西县| 平谷区| 台湾省| 田东县| 阳春市| 南京市| 大姚县| 扎兰屯市| 台江县| 虞城县| 洛南县| 镶黄旗| 勃利县| 定远县| 巩义市| 安达市|