Class : ClassUtil

package pri.lime.main;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration; /**
* 查找指定路径下面实现指定接口的全部类
*
* @author Liang
*
* 2017年5月9日
*/
public class ClassUtil { @SuppressWarnings({ "rawtypes", "unchecked" })
public static ArrayList<Class> getAllClassByInterface(Class clazz) {
ArrayList<Class> list = new ArrayList<>();
// 判断是否是一个接口
if (clazz.isInterface()) {
try {
ArrayList<Class> allClass = getAllClass(clazz.getPackage().getName());
/**
* 循环判断路径下的所有类是否实现了指定的接口 并且排除接口类自己
*/
for (int i = 0; i < allClass.size(); i++) {
/**
* 判断是不是同一个接口
*/
// isAssignableFrom:判定此 Class 对象所表示的类或接口与指定的 Class
// 参数所表示的类或接口是否相同,或是否是其超类或超接口
if (clazz.isAssignableFrom(allClass.get(i))) {
if (!clazz.equals(allClass.get(i))) {
// 自身并不加进去
list.add(allClass.get(i));
}
}
}
} catch (Exception e) {
System.out.println("出现异常");
}
} else {
// 如果不是接口,则获取它的所有子类
try {
ArrayList<Class> allClass = getAllClass(clazz.getPackage().getName());
/**
* 循环判断路径下的所有类是否继承了指定类 并且排除父类自己
*/
for (int i = 0; i < allClass.size(); i++) {
if (clazz.isAssignableFrom(allClass.get(i))) {
if (!clazz.equals(allClass.get(i))) {
// 自身并不加进去
list.add(allClass.get(i));
}
}
}
} catch (Exception e) {
System.out.println("出现异常");
}
}
return list;
} /**
* 从一个指定路径下查找所有的类
*
* @param name
*/
@SuppressWarnings("rawtypes")
private static ArrayList<Class> getAllClass(String packagename) {
ArrayList<Class> list = new ArrayList<>();
// 返回对当前正在执行的线程对象的引用。
// 返回该线程的上下文 ClassLoader。
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
String path = packagename.replace('.', '/');
try {
ArrayList<File> fileList = new ArrayList<>();
/**
* 这里面的路径使用的是相对路径 如果大家在测试的时候获取不到,请理清目前工程所在的路径 使用相对路径更加稳定!
* 另外,路径中切不可包含空格、特殊字符等!
*/
// getResources:查找所有给定名称的资源
// 获取jar包中的实现类:Enumeration<URL> enumeration =
// classLoader.getResources(path);
Enumeration<URL> enumeration = classLoader.getResources("../bin/" + path);
while (enumeration.hasMoreElements()) {
URL url = enumeration.nextElement();
// 获取此 URL 的文件名
fileList.add(new File(url.getFile()));
}
for (int i = 0; i < fileList.size(); i++) {
list.addAll(findClass(fileList.get(i), packagename));
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
} /**
* 如果file是文件夹,则递归调用findClass方法,或者文件夹下的类 如果file本身是类文件,则加入list中进行保存,并返回
*
* @param file
* @param packagename
* @return
*/
@SuppressWarnings("rawtypes")
private static ArrayList<Class> findClass(File file, String packagename) {
ArrayList<Class> list = new ArrayList<>();
if (!file.exists()) {
return list;
}
// 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
File[] files = file.listFiles();
for (File file2 : files) {
if (file2.isDirectory()) {
// assert !file2.getName().contains(".");// 添加断言用于判断
if (!file2.getName().contains(".")) {
ArrayList<Class> arrayList = findClass(file2, packagename + "." + file2.getName());
list.addAll(arrayList);
}
} else if (file2.getName().endsWith(".class")) {
try {
// 保存的类文件不需要后缀.class
list.add(Class.forName(packagename + '.' + file2.getName().substring(0, file2.getName().length() - 6)));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
return list;
}
}

啦啦啦

Java -- 获取指定接口的所有实现类或获取指定类的所有继承类的更多相关文章

  1. 项目中一个普通的Java类如何获取service接口(一)

    在普通的Java类中获取service接口目的是调用接口中的方法,实现数据的持久化等操作: Java类中的获取service接口方法: IfaceDetectService faceDetectSer ...

  2. java基础知识回顾之javaIO类--File类应用:获取指定目录下面的指定扩展名的文件,将文件的绝对路径写入到目的文件当中

    /** * File文件综合应用 * 需求:获取指定目录下面,指定扩展名的文件,将文件的绝对路径写到文本文件当中. *  * 思路:1.需要深度遍历.--递归 * 2.遍历的过程中过滤指定扩展名的文件 ...

  3. Java NIO Path接口和Files类配合操作文件

    Java NIO Path接口和Files类配合操作文件 @author ixenos Path接口 1.Path表示的是一个目录名序列,其后还可以跟着一个文件名,路径中第一个部件是根部件时就是绝对路 ...

  4. java集合类型接口和实现类个人总结

    转载:http://blog.csdn.net/qingchunbusanchang/article/details/39576749 java的集合是一个比较综合的概念,相关的知识有很多的博客里面做 ...

  5. java常用类详细介绍及总结:字符串相关类、日期时间API、比较器接口、System、Math、BigInteger与BigDecimal

    一.字符串相关的类 1.String及常用方法 1.1 String的特性 String:字符串,使用一对""引起来表示. String声明为final的,不可被继承 String ...

  6. java内部类、接口、集合框架、泛型、工具类、实现类

    .t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.内部类 1.成员内部类. (1)成员内部类的实例化: 外部类名.内部类 ...

  7. java反射注解妙用-获取所有接口说明

    转载请注明出处:https://www.cnblogs.com/wenjunwei/p/10293490.html 前言 最近在做项目权限,使用shiro实现restful接口权限管理,对整个项目都进 ...

  8. Java找那个io类-File获取功能

    package com.hxzy.IOSer;import java.io.*; /* * File 的获取功能 * */public class Demo04 { public static voi ...

  9. java 继承类与接口问题

    java 先extends 继承类,再implements 继承接口 public class DataBase extends ClassBase implements Ijiekou { }// ...

随机推荐

  1. tomcat添加context方式部署web应用

    刚巧碰到了,记录一下. 通过context的方式部署会灵活一点,不必一定指向tomcat里面的webapps目录 这种部署有几种方式: 1.在$CATALINA_BASE/conf/ server.x ...

  2. [算法]和为S的两个数字

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 对应每个测试案例,输出两个数,小的先输出. 思路 定义两个指 ...

  3. jquery 异步处理

    <!DOCTYPE html> <head> <script type="text/javascript" src="jquery-1.12 ...

  4. WebRTC 源码分析(三):安卓视频硬编码

    数据怎么送进编码器? 怎么从编码器取数据? 如何做流控? 在开始之前,我们先了解一下 MediaCodec 的基本知识. MediaCodec 基础 Developer 官网 上的描述已经很清楚了,下 ...

  5. 图示 Smart-Art

    在PPT中,图示有两个作用,一是将对象间的逻辑关系视觉化,使文字承载的信息一目了然; 二是打破呆板的页面版式,让枯燥的文本变得更有魅力. 比较聪明的办法是在Sma吨Art生成图形的基础上继续编辑,使其 ...

  6. php 扫描 下载 apk

    $file = 'C:\WebSiteDirectory\CarparkWeixinBackend\Dplus.apk'; if (file_exists($file)) { header('Cont ...

  7. apk签名打包时报master password is required to unlock the password database.错误,或者signtrue versions无法勾选,以及Error:Execution failed for task ':app:lintVitalRelease'.

    1.如果在签名时android studio报"Master password is required to unlock the password database.The passwor ...

  8. Html5學習重點清單

    SVG webSQL 數據庫 SSE 服務推送 MathML 基於xml語法 Web 存储 webSockets通信 canvas 畫布操作 音頻和視頻 地理位置 Geolocation API We ...

  9. Linux高级字符设备驱动 poll方法(select多路监控原理与实现)

    1.什么是Poll方法,功能是什么? 2.Select系统调用(功能)      Select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程.      int selec ...

  10. python进行数据分析------相关分析

    相关分析 import statsmodels.api as sm import pandas as pd import numpy as np from patsy.highlevel import ...