java 包名下的class 遍历_遍历指定包名下所有的类(支持jar)(转)

packagelab.sodino.clazz;importjava.io.File;importjava.io.FileFilter;importjava.io.IOException;importjava.lang.annotation.Annotation;importjava.net.JarURLConnection;importjava.net.URL;importjava.util.ArrayList;importjava.util.Enumeration;importjava.util.List;importjava.util.jar.JarEntry;importjava.util.jar.JarFile;/*** 用于获取指定包名下的所有类名.

* 并可设置是否遍历该包名下的子包的类名.

* 并可通过Annotation(内注)来过滤,避免一些内部类的干扰.

*

*@authorSodino E-mail:sodino@qq.com

*@versionTime:2014年2月10日 下午3:55:59*/

public classClassUtil {public static voidmain(String []args){//标识是否要遍历该包路径下子包的类名//boolean recursive = false;

boolean recursive = true;//指定的包名//String pkg = "javax.crypto.spec";//为java/jre6/lib/jce.jar,普通的java工程默认已引用//String pkg = "javax.crypto";//String pkg = "lab.sodino";

String pkg = "lab.sodino.clazz";

List list= null;//list = getClassList(pkg, recursive, null);//增加 author.class的过滤项,即可只选出ClassTestDemo

list = getClassList(pkg, recursive, author.class);for(int i = 0;i < list.size(); i ++){

System.out.println(i+":"+list.get(i));

}

}public static List> getClassList(String pkgName , boolean isRecursive, Class extends Annotation>annotation) {

List> classList = new ArrayList>();

ClassLoader loader=Thread.currentThread().getContextClassLoader();try{//按文件的形式去查找

String strFile = pkgName.replaceAll("\\.", "/");

Enumeration urls =loader.getResources(strFile);while(urls.hasMoreElements()) {

URL url=urls.nextElement();if (url != null) {

String protocol=url.getProtocol();

String pkgPath=url.getPath();

System.out.println("protocol:" + protocol +" path:" +pkgPath);if ("file".equals(protocol)) {//本地自己可见的代码

findClassName(classList, pkgName, pkgPath, isRecursive, annotation);

}else if ("jar".equals(protocol)) {//引用第三方jar的代码

findClassName(classList, pkgName, url, isRecursive, annotation);

}

}

}

}catch(IOException e) {

e.printStackTrace();

}returnclassList;

}public static void findClassName(List> clazzList, String pkgName, String pkgPath, boolean isRecursive, Class extends Annotation>annotation) {if(clazzList == null){return;

}

File[] files= filterClassFiles(pkgPath);//过滤出.class文件及文件夹

System.out.println("files:" +((files == null)?"null" : "length=" +files.length));if(files != null){for(File f : files) {

String fileName=f.getName();if(f.isFile()) {//.class 文件的情况

String clazzName =getClassName(pkgName, fileName);

addClassName(clazzList, clazzName, annotation);

}else{//文件夹的情况

if(isRecursive){//需要继续查找该文件夹/包名下的类

String subPkgName = pkgName +"."+fileName;

String subPkgPath= pkgPath +"/"+fileName;

findClassName(clazzList, subPkgName, subPkgPath,true, annotation);

}

}

}

}

}/*** 第三方Jar类库的引用。

*@throwsIOException

**/

public static void findClassName(List> clazzList, String pkgName, URL url, boolean isRecursive, Class extends Annotation> annotation) throwsIOException {

JarURLConnection jarURLConnection=(JarURLConnection) url.openConnection();

JarFile jarFile=jarURLConnection.getJarFile();

System.out.println("jarFile:" +jarFile.getName());

Enumeration jarEntries =jarFile.entries();while(jarEntries.hasMoreElements()) {

JarEntry jarEntry=jarEntries.nextElement();

String jarEntryName= jarEntry.getName(); //类似:sun/security/internal/interfaces/TlsMasterSecret.class

String clazzName = jarEntryName.replace("/", ".");int endIndex = clazzName.lastIndexOf(".");

String prefix= null;if (endIndex > 0) {

String prefix_name= clazzName.substring(0, endIndex);

endIndex= prefix_name.lastIndexOf(".");if(endIndex > 0){

prefix= prefix_name.substring(0, endIndex);

}

}if (prefix != null && jarEntryName.endsWith(".class")) {//System.out.println("prefix:" + prefix +" pkgName:" + pkgName);

if(prefix.equals(pkgName)){

System.out.println("jar entryName:" +jarEntryName);

addClassName(clazzList, clazzName, annotation);

}else if(isRecursive &&prefix.startsWith(pkgName)){//遍历子包名:子类

System.out.println("jar entryName:" + jarEntryName +" isRecursive:" +isRecursive);

addClassName(clazzList, clazzName, annotation);

}

}

}

}private staticFile[] filterClassFiles(String pkgPath) {if(pkgPath == null){return null;

}//接收 .class 文件 或 类文件夹

return new File(pkgPath).listFiles(newFileFilter() {

@Overridepublic booleanaccept(File file) {return (file.isFile() && file.getName().endsWith(".class")) ||file.isDirectory();

}

});

}private staticString getClassName(String pkgName, String fileName) {int endIndex = fileName.lastIndexOf(".");

String clazz= null;if (endIndex >= 0) {

clazz= fileName.substring(0, endIndex);

}

String clazzName= null;if (clazz != null) {

clazzName= pkgName + "." +clazz;

}returnclazzName;

}private static void addClassName(List> clazzList, String clazzName, Class extends Annotation>annotation) {if (clazzList != null && clazzName != null) {

Class> clazz = null;try{

clazz=Class.forName(clazzName);

}catch(ClassNotFoundException e) {

e.printStackTrace();

}//System.out.println("isAnnotation=" + clazz.isAnnotation() +" author:" + clazz.isAnnotationPresent(author.class));

if (clazz != null) {if(annotation == null){

clazzList.add(clazz);

System.out.println("add:" +clazz);

}else if(clazz.isAnnotationPresent(annotation)){

clazzList.add(clazz);

System.out.println("add annotation:" +clazz);

}

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值