zoukankan      html  css  js  c++  java
  • Java从Jar文件中动态加载类

     动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行。

    下面通过一个实例来直观演示:

    第一:定义一个抽象类 AbstractAction (稍后换成接口的实例)

    package com.java.loader;  
      
      public abstract class AbstractAction {  
        public abstract String action();  
    }  
    

     第二:写个实体类继承一下 TestAction

    package com.java.jarloader;  
    
    import com.java.loader.AbstractAction;  
     
     public class TestAction extends AbstractAction{  
       public String action() {  
        System.out.println("I am working ! ");  
          return "this ActionTest class";  
        }  
    }
    

     第三:将TestAction所在的包导出成jar包的方式,eclipse中直接export即可,放到指定目录,此处放在

    D:jarload	est.jar  
    

     放好后,删除TestAction文件和package。

    第四:写个main函数测试下 TestMain (这里比较无聊,写了个从文件读的方式获取jar路劲,路径就是上面提到的jar所在的位置)

    package com.java.main;  
    
    import java.io.BufferedReader;  
    import java.io.File;  
    import java.io.FileReader;  
    import java.net.URL;  
    import java.net.URLClassLoader;  
    import com.java.loader.AbstractAction;  
    import com.java.loader.AbstractAction;  
    
    /** 
    *  
     * 两种方式 
     * @author minggang.wumg 
     * 
    */  
     
    public class TestMain {  
    
     public static void main(String[] args) {  
          try {  
                //第一种  配置成文件格式  
                File file = new File("D:\jarload\test.txt");  
                BufferedReader in = new BufferedReader(new FileReader(file));  
               String s = new String();  
               while ((s = in.readLine()) != null) {  
    
                URL url = new URL(s);  
                s = null;  
                   
               URLClassLoader myClassLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread()  
                        .getContextClassLoader());  
                 Class<? extends AbstractAction> myClass = (Class<? extends AbstractAction>)      
                 myClassLoader.loadClass("com.java.jarloader.TestAction");  
                 AbstractAction action = (AbstractAction) myClass.newInstance();  
                String str = action.action();  
                System.out.println(str);  
                  
              //第二种  
              URL url1 = new URL("file:D:/jarload/test.jar");  
              URLClassLoader myClassLoader1 = new URLClassLoader(new URL[] { url1 }, Thread.currentThread() .getContextClassLoader());  
            Class<?> myClass1 = myClassLoader1.loadClass("com.java.jarloader.TestAction");  
            AbstractAction action1 = (AbstractAction) myClass1.newInstance();  
            String str1 = action1.action();  
            System.out.println(str1);  
        }  
      } catch (Exception e) {  
        e.printStackTrace();  
        }  
     }  
     
    

     第五:运行结果:

     

    参考:http://www.cnblogs.com/Bonker/p/5445734.html

  • 相关阅读:
    hdu 2196 树形dp
    codeforces 1A
    [日常摸鱼]bzoj1218[HNOI2003]激光炸弹-二维前缀
    [日常摸鱼]bzoj2724蒲公英-分块
    [日常摸鱼]关于离散化
    [OI笔记]后缀自动机
    [日常摸鱼]poj1509Glass Beads-SAM
    [日常摸鱼]bzoj1083[SCOI2005]繁忙的都市-最小生成树
    [日常摸鱼]bzoj2038[2009国家集训队]小Z的袜子-莫队算法
    [日常摸鱼]三分法
  • 原文地址:https://www.cnblogs.com/moonandstar08/p/5804806.html
Copyright © 2011-2022 走看看