`

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中的一个抽象类,定义了几个关键的方法来支持类的装载。...

    Java基础-类的详解

    接口可以被类实现,实现接口的类必须实现接口中所有的方法。接口主要用来实现多态和解耦合。 多态是指允许不同类的对象对同一消息做出响应的能力,是面向对象编程的核心概念之一。在Java中,多态可以通过继承和接口...

    lagou-bigdata-学习-java继承和多态之接口

    首先,继承是一个类(称为子类)获取另一个类(称为父类)的属性和方法的过程,Java中的继承使用extends关键字来实现。继承的好处在于它允许复用代码,提高开发效率,并且有助于建立类之间的层次关系。其次,多态是...

    CS-Wiki-学习-java继承和多态之接口

    首先,接口在Java中是完全抽象的,即接口中的方法都没有具体实现,它们都是公共的且抽象的,这意味着接口中定义的所有方法都必须在实现了该接口的类中被具体实现。这为编程提供了极高的灵活性,因为它允许开发者定义...

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

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

    java学习路径 不错的文章

    ### Java 学习路径详解 #### 一、安装与配置 - **JDK 安装**: 开始学习 Java 的第一步是正确安装 JDK(Java Development Kit)。JDK 包含了 Java 运行环境 (JRE) 以及编译工具和其他开发工具。 - **Hello World ...

    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()`、`...

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

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

    Java3y.zip

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

    java全集.pdf JAVA全集

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

    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. **线程的生命周期** - 线程的...

Global site tag (gtag.js) - Google Analytics