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

  • 相关阅读:
    NBUT 1120 Reimu's Teleport (线段树)
    NBUT 1119 Patchouli's Books (STL应用)
    NBUT 1118 Marisa's Affair (排序统计,水)
    NBUT 1117 Kotiya's Incantation(字符输入处理)
    NBUT 1115 Cirno's Trick (水)
    NBUT 1114 Alice's Puppets(排序统计,水)
    188 Best Time to Buy and Sell Stock IV 买卖股票的最佳时机 IV
    187 Repeated DNA Sequences 重复的DNA序列
    179 Largest Number 把数组排成最大的数
    174 Dungeon Game 地下城游戏
  • 原文地址:https://www.cnblogs.com/moonandstar08/p/5804806.html
Copyright © 2011-2022 走看看