`
hacker_zxf
  • 浏览: 144638 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

jar包读取例子

DOS 
阅读更多
    首先,当知道当前需要的类所在的包地址,例如:/com/zhouxf/jarread/dos/impl 这样一个目录,当项目被打包成test.jar ,你如何获取到这个包地址下的所有的class文件呢。
   一般要获取都是在某一个类里面,例如factory或者相关的manager里面。在相对的目录中获取所需要的class文件,并且实例化这些class的过程。
   例子如下:

   首先定义一个球的接口:
public interface Ball {

    /**
     * 输出球类型
     */
    void getName();
}

然后实现接口
public class BasketBall implements Ball {

    public void getName() {
        // TODO Auto-generated method stub
        System.out.println("BasketBall.........");
    }

}

public class FootBall implements Ball {

    public void getName() {
        // TODO Auto-generated method stub
        System.out.println("FootBall.........");
    }
}


然后打包代码test.jar, 把他导入到工程。

下面写一个类来读取jar包;

/**
 * 读取类,然后输出相关信息
 * 
 * @author xiaofeng.zhouxf
 */
public class JarReader {

    private Map          map;
    private final String pointClass    = ".class";
    private final String slash         = "/";
    private final String point         = ".";
    private final String javaSeparator = "\\\\";
    private final String packagePath   = "/com/zhouxf/jarread/dos/impl";
    private final String jarName       = "test.jar";                     ;

    public void test() throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {

        // 用来存放包下class文件
        map = new HashMap();
        // 取得资源所在目录
        URL url = this.getClass().getResource(packagePath);
        String resourcePath = url.getFile(); 
        resourcePath = resourcePath.substring(1); 
        int index = resourcePath.indexOf(packagePath);
        String diskPath = resourcePath.substring(0, index);

        resourcePath = resourcePath.replace(slash, javaSeparator);
        diskPath = diskPath.replace(slash, javaSeparator);
        // 取得jar包对象
        JarFile file = new JarFile((diskPath + javaSeparator + jarName));
        // 判断和获取jar包中的entry
        Enumeration<JarEntry> entries = file.entries();
        while (entries.hasMoreElements()) {
            JarEntry entry = entries.nextElement();
            String entryName = entry.getName();
            // System.out.println("entryName:" + entryName);
            if (entryName.indexOf(packagePath.substring(1)) != -1) {
                String classPath = entryName.substring(0, entryName.indexOf(pointClass)).replace(slash, point); 
                Ball ball = (Ball) Class.forName(classPath).newInstance();
                ball.getName();
            }
        }
    }

    public static void main(String... strings) {
        JarReader reader = new JarReader();
        try {
            reader.test();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}


这样,就能打印出

BasketBall.........
FootBall.........


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics