`

JAVA获取同一路径下所有子类或接口实现类

 
阅读更多

整个测试代码如下:

Java代码 收藏代码
  1. packagefind;
  2. importjava.io.File;
  3. importjava.io.IOException;
  4. importjava.net.URL;
  5. importjava.util.ArrayList;
  6. importjava.util.List;
  7. importfind.test.Intf;
  8. importfind.test.Man;
  9. publicclassClassUtil{
  10. publicstaticvoidmain(String[]args){
  11. try{
  12. System.out.println("接口实现类:");
  13. for(Class<?>c:getAllAssignedClass(Intf.class)){
  14. System.out.println(c.getName());
  15. }
  16. System.out.println("子类:");
  17. for(Class<?>c:getAllAssignedClass(Man.class)){
  18. System.out.println(c.getName());
  19. }
  20. }catch(ClassNotFoundExceptione){
  21. //TODOAuto-generatedcatchblock
  22. e.printStackTrace();
  23. }catch(IOExceptione){
  24. //TODOAuto-generatedcatchblock
  25. e.printStackTrace();
  26. }
  27. }
  28. /**
  29. *获取同一路径下所有子类或接口实现类
  30. *
  31. *@paramintf
  32. *@return
  33. *@throwsIOException
  34. *@throwsClassNotFoundException
  35. */
  36. publicstaticList<Class<?>>getAllAssignedClass(Class<?>cls)throwsIOException,
  37. ClassNotFoundException{
  38. List<Class<?>>classes=newArrayList<Class<?>>();
  39. for(Class<?>c:getClasses(cls)){
  40. if(cls.isAssignableFrom(c)&&!cls.equals(c)){
  41. classes.add(c);
  42. }
  43. }
  44. returnclasses;
  45. }
  46. /**
  47. *取得当前类路径下的所有类
  48. *
  49. *@paramcls
  50. *@return
  51. *@throwsIOException
  52. *@throwsClassNotFoundException
  53. */
  54. publicstaticList<Class<?>>getClasses(Class<?>cls)throwsIOException,
  55. ClassNotFoundException{
  56. Stringpk=cls.getPackage().getName();
  57. Stringpath=pk.replace('.','/');
  58. ClassLoaderclassloader=Thread.currentThread().getContextClassLoader();
  59. URLurl=classloader.getResource(path);
  60. returngetClasses(newFile(url.getFile()),pk);
  61. }
  62. /**
  63. *迭代查找类
  64. *
  65. *@paramdir
  66. *@parampk
  67. *@return
  68. *@throwsClassNotFoundException
  69. */
  70. privatestaticList<Class<?>>getClasses(Filedir,Stringpk)throwsClassNotFoundException{
  71. List<Class<?>>classes=newArrayList<Class<?>>();
  72. if(!dir.exists()){
  73. returnclasses;
  74. }
  75. for(Filef:dir.listFiles()){
  76. if(f.isDirectory()){
  77. classes.addAll(getClasses(f,pk+"."+f.getName()));
  78. }
  79. Stringname=f.getName();
  80. if(name.endsWith(".class")){
  81. classes.add(Class.forName(pk+"."+name.substring(0,name.length()-6)));
  82. }
  83. }
  84. returnclasses;
  85. }
  86. }

运行结果如下:

Java代码 收藏代码
  1. 接口实现类:
  2. find.test.impl.IntfImpl2
  3. find.test.IntfImpl
  4. 子类:
  5. find.test.BadMan
  6. find.test.impl.GoodMan
目录接口如下:
Java代码 收藏代码
  1. src
  2. |----find
  3. |----ClassUtil.java
  4. |----test
  5. |----BadMan.java
  6. |----impl
  7. ||----GoodMan.java
  8. ||----IntfImpl2.java
  9. |----Intf.java
  10. |----IntfImpl.java
  11. |----Man.java
分享到:
评论

相关推荐

    JAVA读取同一路径下所有类及其方法

    这个类中有一个 `getAllAssignedClass` 方法,用于获取同一路径下所有子类或接口实现类。这个方法使用 `getClasses` 方法来获取当前类路径下的所有类,然后过滤出继承自 `com.post.common.BaseAction` 的类。 ...

    Java技术----实现JAVA的动态类载入机制

    动态类加载机制的核心在于`java.lang.ClassLoader`类及其子类。开发者可以通过重写`loadClass(String className)`方法来自定义加载逻辑。当调用`Class.forName()`或`ClassLoader.loadClass()`时,JVM会使用类加载器...

    Java虚拟机类装载的原理及实现

    在JVM中,类的装载是由`ClassLoader`及其子类实现的。`ClassLoader`是Java运行时系统的一个核心组件,负责查找和装入类文件。 - **`ClassLoader`**:这是Java中的一个抽象类,定义了几个关键的方法来支持类的装载。...

    加载同一类型但是版本不同JDBC驱动

    在Java编程中,数据库连接是通过Java Database Connectivity (JDBC) API实现的,它提供了一组接口和类,使得Java程序能够与各种数据库进行交互。然而,不同的数据库版本可能需要不同版本的JDBC驱动,这可能导致兼容...

    Java加载。jar包

    它是子类 `ClassLoader` 需要重写的关键方法之一,目的是实现类的自定义加载逻辑。 3. **`defineClass` 方法**: - `defineClass` 方法用于将字节码转换为 `Class` 对象。它处理了许多复杂的内部细节,例如解析...

    达内core_java学习笔记

    集合框架是Java处理对象组的一种方式,包括List、Set和Map等接口,以及ArrayList、HashSet、HashMap等实现类。理解这些集合的特点和使用场景,是提升编程效率的关键。 七、IO流 Java的输入/输出(IO)流系统支持对...

    JAVA基础入门到精通pdf

    10. **多线程**:Java内置对多线程的支持,通过Thread类或Runnable接口实现并发执行。同步机制如synchronized关键字、wait/notify机制防止并发问题。 11. **网络编程**:Java提供了丰富的网络编程API,如Socket和...

    详细的java基础总结

    `Collection`接口是最基本的容器接口,所有的单列集合类都是它的实现类。`Collection`接口的主要子接口有`Set`和`List`。 - **Collection接口常用方法** `Collection`接口定义了一些基本的方法,如`add()`、`...

    Java3y.zip

    多态是指同一种行为可以有不同的表现形式,这在Java中通过接口和抽象类实现。 5. **异常处理**:Java使用try-catch-finally语句块进行异常处理,使得程序在遇到错误时能优雅地处理,而不是突然崩溃。 6. **集合...

    java全集.pdf JAVA全集

    - **集合类层次**:`List`、`Set`、`Map`等接口的具体实现类。 - **五个最常用的集合类之间的区别和联系**:ArrayList、LinkedList、HashSet、TreeSet、HashMap。 - **比较**:根据具体需求选择合适的集合类。 **...

    Java面向对象程序设计耿祥义版课件

    Java集合框架包括List、Set、Queue等接口及其实现类,如ArrayList、HashSet、LinkedList等,它们提供了存储和操作对象的高效工具。 六、设计模式 面向对象设计模式是解决常见问题的最佳实践,如单例模式、工厂模式...

    java的精髓.txt

    接口可以被类实现,实现类必须提供接口中所有方法的具体实现。接口可以看作是类之间的一种约定,规定了某些方法的行为规范。 #### 七、Java反射机制 - **反射**:Java反射机制允许在运行时获取类的信息(如字段、...

    java方向面试宝典.pdf

    public允许所有类访问,private限制在同一类内访问,protected允许同一包内及子类访问,而默认修饰符只允许同一包内的类访问。 Java多线程编程主要通过实现Runnable接口或继承Thread类来创建线程。Java泛型提高了...

    Java 基础核心总结

    Java中的所有异常都继承自Throwable类,它有两个主要子类:Error和Exception。Error表示严重的错误,通常是系统错误,而Exception则表示可恢复的错误。通过try、catch、finally语句和throws关键字,可以对异常进行...

    黑马程序员入学Java精华总结

    - 继承`Thread`类或实现`Runnable`接口。 3. **两种进程创建方式比较** - 继承`Thread`类可以直接访问和修改线程属性。 - 实现`Runnable`接口更灵活,可以被多个线程共享。 4. **线程的生命周期** - 线程的...

    JAVA程序员笔试面试题汇总及答案.pdf,这是一份不错的文件

    * 历史原因:Hashtable 基于陈旧的 Dictionary 类,HashMap 是 Java 1.2 引进的 Map 接口的一个实现 * 同步性:Hashtable 是线程安全的,HashMap 是线程不安全的 * 值:只有 HashMap 可以让你将空值作为一个表的条目...

    Java编程的逻辑

    7. **集合框架**:Java集合框架包括List、Set、Queue和Map等接口,以及ArrayList、HashSet、LinkedList、HashMap等实现类,用于存储和管理对象。理解它们的区别和应用场景是Java编程的关键。 8. **输入输出流**:...

    java初级chap05(ppt文档).ppt

    多态性则是指同一种行为可以有不同的表现形式,这在Java中通过接口和抽象类实现。接口是一种完全抽象的类型,它只包含常量和抽象方法,可以被多个类实现。实现接口的类必须提供接口中所有方法的具体实现。抽象类则...

Global site tag (gtag.js) - Google Analytics