`
tomcat_oracle
  • 浏览: 312182 次
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多
package find;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import find.test.Intf;
import find.test.Man;
public class ClassUtil {
public static void main(String[] args) {
try {
System.out.println("接口实现类:");
for (Class<?> c : getAllAssignedClass(Intf.class)) {
System.out.println(c.getName());
}
System.out.println("子类:");
for (Class<?> c : getAllAssignedClass(Man.class)) {
System.out.println(c.getName());
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 获取同一路径下所有子类或接口实现类
*
* @param intf
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public static List<Class<?>> getAllAssignedClass(Class<?> cls) throws IOException,
ClassNotFoundException {
List<Class<?>> classes = new ArrayList<Class<?>>();
for (Class<?> c : getClasses(cls)) {
if (cls.isAssignableFrom(c) && !cls.equals(c)) {
classes.add(c);
}
}
return classes;
}
/**
* 取得当前类路径下的所有类
*
* @param cls
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public static List<Class<?>> getClasses(Class<?> cls) throws IOException,
ClassNotFoundException {
String pk = cls.getPackage().getName();
String path = pk.replace('.', '/');
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
URL url = classloader.getResource(path);
return getClasses(new File(url.getFile()), pk);
}
/**
* 迭代查找类
*
* @param dir
* @param pk
* @return
* @throws ClassNotFoundException
*/
private static List<Class<?>> getClasses(File dir, String pk) throws ClassNotFoundException {
List<Class<?>> classes = new ArrayList<Class<?>>();
if (!dir.exists()) {
return classes;
}
for (File f : dir.listFiles()) {
if (f.isDirectory()) {
classes.addAll(getClasses(f, pk + "." + f.getName()));
}
String name = f.getName();
if (name.endsWith(".class")) {
classes.add(Class.forName(pk + "." + name.substring(0, name.length() - 6)));
}
}
return classes;
}
}

 运行结果如下:

  接口实现类:
find.test.impl.IntfImpl2
find.test.IntfImpl
子类:
find.test.BadMan
find.test.impl.GoodMan
  目录接口如下:
src
|----find
|----ClassUtil.java
|----test
|----BadMan.java
|----impl
|    |----GoodMan.java
|    |----IntfImpl2.java
|----Intf.java
|----IntfImpl.java
|----Man.java
 
5
1
分享到:
评论

相关推荐

    JAVA面试题最全集

    51.Object类(或者其子类)的finalize()方法在什么情况下被调用? 52.一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历...

    java 面试题 总结

    接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...

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

    接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...

    java-servlet-api.doc

    所有的JavaServlet都会直接地或间接地执行javax.servlet.Servlet接口,这样它才能在一个Servlet引擎中运行。Servlet引擎是Web服务器按照JavaServletAPI定制的扩展。Servlet引擎提供网络服务,能够理解MIME请求,并...

    【04-面向对象(上)】

    •Java通过关键字extends来实现,实现继承的类称为子类,被继承的类称为基类、超类、父类。父类是大类,子  类是小类。 •Java的继承是单继承,每个子类最多只有一个直接父类。 本文原创作者:pipi-...

    asp.net知识库

    运算表达式类的原理及其实现 #实现的18位身份证格式验证算法 身份证15To18 的算法(C#) 一组 正则表达式 静态构造函数 忽略大小写Replace效率瓶颈IndexOf 随机排列算法 理解C#中的委托[翻译] 利用委托机制处理.NET中...

    Python核心编程第二版(ok)

     12.2.2 搜索路径和路径搜索   12.3 名称空间   12.3.1 名称空间与变量作用域比较   12.3.2 名称查找.c确定作用域.c覆盖   12.3.3 无限制的名称空间   12.4 导入模块   12.4.1 import语句   ...

    Python核心编程第二版

     12.2.2 搜索路径和路径搜索   12.3 名称空间   12.3.1 名称空间与变量作用域比较   12.3.2 名称查找、确定作用域、覆盖   12.3.3 无限制的名称空间   12.4 导入模块   12.4.1 import语句   ...

    ZendFramework中文文档

    10.4.2. 同一表中查询多列数据 10.4.3. 多表联合查询 10.4.4. WHERE条件 10.4.5. GROUP BY分句 10.4.6. HAVING 条件 10.4.7. ORDER BY 分句 10.4.8. 通过总数和偏移量进行LIMIT限制 10.4.9. 通过页数和总数...

Global site tag (gtag.js) - Google Analytics