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

  • 相关阅读:
    12. nc/netcat 用法举例
    7. 由一道ctf学习变量覆盖漏洞
    11. 几点基于Web日志的Webshell检测思路
    约瑟夫环
    栈结构的经典算法题
    二叉查找树之二
    fork与vfork
    数组常见算法题
    赛马问题
    fibonacci 数列及其应用
  • 原文地址:https://www.cnblogs.com/moonandstar08/p/5804806.html
Copyright © 2011-2022 走看看