動態載入jar,實現自訂業務

來源:互聯網
上載者:User

標籤:meta   snap   code   equal   get   ext   com   bst   項目   

在實際業務中,我們經常會遇到需要按不同使用者實現不同商務邏輯,如果按照最簡單粗暴的做法,當然是使用if else ...來實現。

不過作為一個社會人,這樣怎麼能體現出我們的戰鬥力呢,下面我們來實現一個牛叉的方法。

具體思路:

將不同的商務邏輯按使用者放到不同的jar包,然後系統通過讀取jar包,來實現各自業務;

以後即使使用者的邏輯發生變化,也只要把jar包上傳到伺服器,就可以動態實現,不影響生產環境了。

1.介面

public interface InterfaceAction {    public String getId();    public abstract String action();}

 

2.建立項目

action.ext.bj

pom.xml 依賴於base包

<dependency>            <groupId>com.qn</groupId>            <artifactId>action.base</artifactId>            <version>0.0.1-SNAPSHOT</version>
</dependency>

 實現介面

public class ExtBj implements InterfaceAction {    /**      * @see action.base.code.InterfaceAction#getId()     */    @Override    public String getId() {        return "bj";    }    /**      * @see action.base.code.InterfaceAction#action()     */    @Override    public String action() {        return "This is bj....";    }}

按照此項目建立個action.ext.nt

實現完介面後,匯出jar包,存放到一個目錄下;

 

3.完成自訂MyClassLoader

public class MyClassLoader {    private ClassLoader                  loader;    private Map<String, InterfaceAction> actionMap = new HashMap<>();    /**     * Getter method for property <tt>actionMap</tt>.     *      * @return property value of actionMap     */    public Map<String, InterfaceAction> getActionMap() {        return actionMap;    }    /**     * Setter method for property <tt>actionMap</tt>.     *      * @param actionMap value to be assigned to property actionMap     */    public void setActionMap(Map<String, InterfaceAction> actionMap) {        this.actionMap = actionMap;    }    public void load(String jarFileName) {        JarFile jarFile = null;        try {            File file = new File(jarFileName);            URL url = new URL("file:" + jarFileName);            loader = new URLClassLoader(new URL[] { url });            file.lastModified();            jarFile = new JarFile(file);            Enumeration<JarEntry> enumFiles = jarFile.entries();            JarEntry entry;            //遍曆Jar包中的每一個檔案            while (enumFiles.hasMoreElements()) {                entry = enumFiles.nextElement();                String classFullName = entry.getName();                //僅處理.class檔案                if (classFullName.indexOf("META-INF") < 0 && classFullName.indexOf(".class") > 0) {                    String className = classFullName.substring(0, classFullName.length() - 6)                        .replaceAll("/", ".");                    //使用當前類載入器載入jar包中的類                    System.out.println("載入類start:" + className);                    Class<?> clazz = loader.loadClass(className);                    System.out.println("載入類end:" + clazz);                    boolean flag = isInterface(clazz, InterfaceAction.class);                    if (flag) {                        InterfaceAction ia = ((Class<InterfaceAction>) clazz).newInstance();                        actionMap.put(ia.getId(), ia);                        System.out.println(actionMap);                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 是否實現該介面     * @param c     * @param szInterface     * @return     */    private boolean isInterface(Class c, Class szInterface) {        Class[] face = c.getInterfaces();        for (int i = 0, j = face.length; i < j; i++) {            if (face[i].equals(szInterface)) {                return true;            }        }        return false;    }}

 

4.接下來就是test了

 public static void main(String[] args) {        MyClassLoader ml = new MyClassLoader();        ml.load("D:\\temp\\action.ext.bj.jar");        ml.load("D:\\temp\\action.ext.nt.jar");        String s = ml.getActionMap().get("nt").action();        System.out.println(s);    }
載入類start:action.ext.bj.ExtBj載入類end:class action.ext.bj.ExtBj{[email protected]}載入類start:action.ext.nt.ExtNt載入類end:class action.ext.nt.ExtNt{[email protected], [email protected]}This is nt.....

韋爵爺說過:大功告成。。。

 

動態載入jar,實現自訂業務

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.