获取指定包下的所有类

因为包多的话,遍历查找会损耗性能。
所以我想只加载某个包,然后查找类。
请问可以实现吗?
最好能给一些示例代码。
谢谢。
2012-07-11 13:06 网友采纳
private static List<Class> getClassesByPackageName(String packageName)
   throws IOException, ClassNotFoundException {
  ClassLoader classLoader = Thread.currentThread()
    .getContextClassLoader();
  String path = packageName.replace('.', '/');
  Enumeration<URL> resources = classLoader.getResources(path);
  List<File> dirs = new ArrayList<File>();
  while (resources.hasMoreElements()) {
   URL resource = resources.nextElement();
   dirs.add(new File(resource.getFile()));
  }
  ArrayList<Class> classes = new ArrayList<Class>();
  for (File directory : dirs) {
   classes.addAll(findClasses(directory, packageName));
  }
  return classes;
 }
 private static List<Class> findClasses(File directory, String packageName)
   throws ClassNotFoundException {
  List<Class> classes = new ArrayList<Class>();
  if (!directory.exists()) {
   return classes;
  }
  File[] files = directory.listFiles();
  for (File file : files) {
   if (file.isDirectory()) {
    // 递归查找文件夹【即对应的包】下面的所有文件
    assert !file.getName().contains(".");
    classes.addAll(findClasses(file, packageName + '.'
      + file.getName()));
   } else if (file.getName().endsWith(".class")) {
    classes.add(Class.forName(packageName
      + "."
      + file.getName().substring(0,
        file.getName().length() - 6)));
   }
  }
  return classes;
 }
 public static void main(String[] args) {
  try {
   List<Class> list=getClassesByPackageName("com.test");
   for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i).getName());
   }
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 
   
 
   
///2016.3.15以下是我调试通过:
package test;


import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;

public class TestClass
{
	public static void main(String[] args) 
	{
	  try {
		  ArrayList<Class> list=getClassesByPackageName("test");
	   for (int i = 0; i < list.size(); i++) {
	    System.out.println(list.get(i).getName());
	   }
	  } catch (IOException e) {
	   // TODO Auto-generated catch block
	   e.printStackTrace();
	  } catch (ClassNotFoundException e) {
	   // TODO Auto-generated catch block
	   e.printStackTrace();
	  }
	}
	
private static ArrayList<Class> getClassesByPackageName(String packageName)
throws IOException, ClassNotFoundException 
{
	  ClassLoader classLoader = Thread.currentThread()
	    .getContextClassLoader();
	  String path = packageName.replace('.', '/');
	  Enumeration<URL> resources = classLoader.getResources(path);
	  ArrayList<File> dirs = new ArrayList<File>();
	  while (resources.hasMoreElements()) {
	   URL resource = resources.nextElement();
	   dirs.add(new File(resource.getFile()));
	  }
	  ArrayList<Class> classes = new ArrayList<Class>();
	  for (File directory : dirs) {
	   classes.addAll(findClasses(directory, packageName));
	  }
	  return classes;
}




private static ArrayList<Class> findClasses(File directory, String packageName)
throws ClassNotFoundException 
{
	  ArrayList<Class> classes = new ArrayList<Class>();
	  if (!directory.exists()) 
	  {
		  return classes;
	  }
	  File[] files = directory.listFiles();
	  for (File file : files) 
	  {
		   if (file.isDirectory()) 
		   {
			    // 递归查找文件夹【即对应的包】下面的所有文件
			    assert !file.getName().contains(".");
			    classes.addAll(findClasses(file, packageName + '.'
			      + file.getName()));
		   } 
		   else if (file.getName().endsWith(".class")) 
		   {
			    classes.add(Class.forName(packageName
			      + "."
			      + file.getName().substring(0,
			        file.getName().length() - 6)));
		   }
	  }
	  return classes;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值