有的时候会有疑问,一个开源项目会有多少个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在最上面,拷贝进去,直接运行即可。。