`
jiahh
  • 浏览: 37720 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

查找接口类对应包下的所有类ClassUtil

 
阅读更多
package com.corejava.model.abstractmodel.util;

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

import com.corejava.model.abstractmodel.inter.test.TestA;

public class ClassUtils {

public static List<Class> getAllClassbyInterface(Class c) {

List<Class> returnList = new ArrayList<Class>();

if (c.isInterface()) { // 如果是接口。。。。
String packageName = c.getPackage().getName();
System.out.println("当前接口在的包"+packageName);

try {
List<Class> allClass = getClasses(packageName);
                for(int i=0;i<allClass.size();i++){
                if(!c.equals(allClass.get(i))){
                returnList.add(allClass.get(i));
                }
                }

}
catch (IOException e) {

e.printStackTrace();
}
catch (ClassNotFoundException e) {

e.printStackTrace();
}
}

return returnList;
}

/**
* 从一个包中查到所有的类
*
* @param packageName
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
private static List<Class> getClasses(String packageName) throws IOException, ClassNotFoundException {

List<Class> classes = new ArrayList<Class>();

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
System.out.println("************"+packageName.indexOf("."));
// String aa = "com/corejava/model.abstractmodel.inter";

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()));
}
for (File dir : dirs) {
classes.addAll(findClass(dir, packageName));
}
return classes;
}

/**
* @param directory
*            文件路径
* @param packageName
*            包名
* @return 查找这个包下面的所有的class文件
* @throws ClassNotFoundException
*/
private static List<Class> findClass(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(findClass(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) {
   

List <Class> list = getAllClassbyInterface(TestA.class);

System.out.println("------"+list.size());

for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}





    }



}
分享到:
评论

相关推荐

    最简化tomcat设计,socket,web服务器

    4,如果访问的是sevlet,则使用类加载器,根据configServlet.xml中配置的参数,查找对应的class,载入 5,最后执行方法. 6,可扩展开发,在com.cm.util包下,可编写专门读取txt,ini,propertie等文件的实现类, 当然...

    北大青鸟 Java 教材 第7章描述详细,有示例及图解.

    java.util 包提供了许多有用的类和接口,用于处理日期、时间、集合和数学运算等。其中,java.lang 包是 Java 的核心包,包含了 String、Math、Object 和 Class 等类,它们都是 Java 编程的基础。 二、Date 类 Date...

    java常用工具类的使用

    而Date的其他构造方法和普通方法的API都不容易实现国际化,因此目前Date类的大多数方法都被标识为过时,表示更灵活的时间类请参考java.util.Calendar。 Date的输出结果是按照国际通用格式输出的,而中国更习惯于...

    java 面试题 总结

    当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用...

    jsr80 java 访问 usb

    usb.util : 这个包提供了一些有用的实用程序,可以将 firmware下载到 USB 设备上、将 USB 系统的内容转储到 XML 中、以及将只有 bulk I/O 的 USB 设备工具转换成一个套接字(socket)。 usb.devices : 这个可选包收集...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    现在,Java EE 后端与 Flex 前端的接口已经定义好了,要完成 Java EE 后端的接口实现类非常容易,利用 Spring 强大的依赖注入功能,可以通过几行简单的代码完成: 清单 2. FlexServiceImpl class public class ...

    超级有影响力霸气的Java面试题大全文档

    当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    现在,Java EE 后端与 Flex 前端的接口已经定义好了,要完成 Java EE 后端的接口实现类非常容易,利用 Spring 强大的依赖注入功能,可以通过几行简单的代码完成: 清单 2. FlexServiceImpl class public ...

    jdbc基础和参考

    //查找s_user表中所有的数据,并且返回他们的集合 public Collection&lt;User&gt; findAll(){ } //按照名字进行删除 public int deleteUser(String name){ } //将user对象的信息更新到数据库表中 public int ...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    freemarker总结

    有一种特殊的字符串称为raw字符串,被认为是纯文本,其中的\和{等不具有特殊含义,该类字符串在引号前面加r,下面是一个例子: ${r"/${data}"year""}屏幕输出结果为:/${data}"year" 转义 含义 ...

Global site tag (gtag.js) - Google Analytics