统计Jar包中包含了多少个Java类

有的时候会有疑问,一个开源项目会有多少个Java类,这个时候一个个去数就很麻烦了,拿到jar包,我们可以通过java代码来统计出来。

先上代码吧。。。

import java.io.File;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

/**
 * Created by HuLuo on 2016/10/13.
 */


public class Main
{
    public static void main(String[] args) throws ClassNotFoundException, IOException
    {
        
        
        //        URL url = new URL( "jar: file:E:/commons-fileupload-1.3.jar!/" );
        //        JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();
        //        JarFile jarFile = jarURLConnection.getJarFile();
        //
        //        Enumeration<JarEntry> jarEntries = jarFile.entries();
        //
        //        int number = 0 ;
        //        while(jarEntries.hasMoreElements())
        //        {
        //            JarEntry jarEntry = jarEntries.nextElement();
        //            String jarEntryName = jarEntry.getName();
        //            if(jarEntryName.endsWith( ".class" ))
        //            {
        //                System.out.println(jarEntryName);
        //            }
        //            number++;
        //        }
        //        System.out.println(number);
        
        getSpringClassNumber();
        
    }
    
    
    private static void getSpringClassNumber() throws IOException
    {
        File springJar = new File( "E:/spring" );
        
        List<URL> list = new ArrayList<URL>();
        
        File[] allSpringJar = springJar.listFiles();
        
        int result = 0;
        for(File temp : allSpringJar)
        {
            String urlName = "jar: file:";
            String name = temp.toString();
            name.replace( "\\", "//" );
            
            urlName += name;
            urlName += "!/";
            System.out.println( urlName );
            
            result += classNumberPerJarFile( urlName ) ;
        }
        System.out.printf( "jar包里包含总的class文件数是" + result );
        
    }
    
    private static int classNumberPerJarFile(String urlName) throws IOException
    {
        URL url = new URL( urlName );
        JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();
        JarFile jarFile = jarURLConnection.getJarFile();
        
        Enumeration<JarEntry> jarEntries = jarFile.entries();
        int i = 0;
        while(jarEntries.hasMoreElements())
        {
            JarEntry jarEntry = jarEntries.nextElement();
            if(jarEntry.getName().endsWith( ".class" ))
            {
                i++;
            }
            
        }
        return i;
        
    }
    
    
}
代码的功能是将放置在E:/spring目录下的所有jar包里的所有class文件的总数统计出来。

要在具体说一下思路

收先我们new一个目录对象,

对象对应一个E:/spring这个文件夹

将全部的该文件夹下的jar文件都列举出来,放入一个数组中.

这个数组里面包含的是一个个的Jar文件File对象。

jar文件笔者这里是通过URL来访问的。

URL这个类就笔者本身而言只使用过三种protocol file  jar  http 其他的protocol笔者暂时还没用过。

jar protocol的字符串格式是这样的----------------------------> 

jar: file:E:/commons-fileupload-1.3.jar!/

前面有 jar: file:     后面  !/结尾

所以我们要想办法拼接出来。

至于中间的,可以通过FIle对象直接得到。


得到URL这个类之后,我们可以打开连接 ,将其强制转换成 JarURLConnection对象。

再通过JarURLConnection的getJarFile()方法得到JarFile对象

最后将所有的Entry都列举出来,看看这些entry是否以.class结尾。如果是统计数加1。

一个jar包如此,多个jar包写个循环即可,

代码demo在最上面,拷贝进去,直接运行即可。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
activation-1.1.jar antlr-2.7.2.jar aopalliance-1.0.jar aopalliance.jar apache-commons-codec-1.4.jar asm-3.3.1.jar asm-3.3.jar asm-commons-3.3.jar asm-tree-3.3.jar axis2-java2wsdl-1.0.jar builder-0.6.2.jar c3p0-0.9.1.2.jar cglib-2.2.2.jar cglib-2.2.jar classworlds-1.1.jar com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aopalliance-sources-1.0.0.jar com.springsource.org.apache.commons.logging-1.1.1.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar commons-beanutils-1.8.0.jar commons-beanutils-1.8.3.jar commons-chain-1.2.jar commons-codec-1.10.jar commons-codec-1.9.jar commons-collections-3.1.jar commons-collections-3.2.jar commons-dbcp-1.2.jar commons-digester-2.0.jar commons-fileupload-1.2.jar commons-fileupload-1.3.2.jar commons-fileupload-1.3.jar commons-io-1.3.1.jar commons-io-2.0.1.jar commons-io-2.2.jar commons-lang-2.4.jar commons-lang3-3.1.jar commons-lang3-3.2.jar commons-logging-1.1.1.jar commons-logging-1.1.3.jar commons-logging-1.2.jar commons-logging-api-1.1.jar commons-validator-1.3.1.jar core-0.6.2.jar cxf-api-2.7.4.jar cxf-rt-bindings-soap-2.7.4.jar cxf-rt-bindings-xml-2.7.4.jar cxf-rt-core-2.7.4.jar cxf-rt-databinding-jaxb-2.7.4.jar cxf-rt-frontend-jaxws-2.7.4.jar cxf-rt-frontend-simple-2.7.4.jar cxf-rt-transports-http-2.7.4.jar cxf-rt-ws-addr-2.7.4.jar cxf-rt-ws-policy-2.7.4.jar cxf-site-export-1.0-20130910.143757-9.jar dom4j-1.6.1.jar druid-1.0.12.jar dwr-1.1.1.jar ezmorph-1.0.6.jar fastjson-1.1.15.jar freemarker-2.3.19.jar freemarker-2.3.22.jar geronimo-javamail_1.4_spec-1.7.1.jar geronimo-jta_1.1_spec-1.1.1.jar google-collections-1.0.jar google-gxp-0.2.4-beta.jar gson-2.2.4.jar guava-r09.jar httpclient-4.4.jar httpcore-4.4.jar jackson-annotations-2.5.0.jar jackson-core-2.5.0.jar jackson-core-asl-1.9.2.jar jackson-databind-2.3.4.jar jackson-databind-2.5.0.jar jackson-mapper-asl-1.9.2.jar jackson-module-jaxb-annotations-2.1.0.jar jai_imag
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值