工具类如下:
publicclassClassUtils{//给一个接口,返回这个接口的所有实现类publicstatic List<Class>getAllClassByInterface(Classc){
List<Class> returnClassList=newArrayList<Class>();// 返回结果// 如果不是一个接口,则不做处理if(c.isInterface()){
String packageName= c.getPackage().getName();// 获得当前的包名try{
List<Class> allClass=getClasses(packageName);// 获得当前包下以 及子包下的所有类// 判断是否是同一个接口for(int i=0; i< allClass.size(); i++){if(c.isAssignableFrom(allClass.get(i))){// 判断是不是一个接口if(!c.equals(allClass.get(i))){// 本身不加进去
returnClassList.add(allClass.get(i));}}}}catch(ClassNotFoundException e){
e.printStackTrace();}catch(IOException e){
e.printStackTrace();}}return returnClassList;}//从一个包中查找出所有的类,在jar包中不能查找privatestatic List<Class>getClasses(String packageName)throws ClassNotFoundException, IOException{
ClassLoader classLoader= Thread.currentThread().getContextClassLoader();
String path= packageName.replace('.','/');
Enumeration<URL> resources= classLoader.getResources(path);
List<File> dirs=newArrayList<File>();while(resources.hasMoreElements()){
URL resource= resources.nextElement();
dirs.add(newFile(resource.getFile()));}
ArrayList<Class> classes=newArrayList<Class>();for(File directory: dirs){
classes.addAll(findClasses(directory, packageName));}return classes;}privatestatic List<Class>findClasses(File directory, String packageName)throws ClassNotFoundException{
List<Class> classes=newArrayList<Class>();if(!directory.exists()){return classes;}
File[] files= directory.listFiles();for(File file: files){if(file.isDirectory()){assert!file.getName().contains(".");
classes.addAll(findClasses(file, packageName+"."+ file.getName()));}elseif(file.getName().endsWith(".class")){
classes.add(Class.forName(packageName+'.'+ file.getName().substring(0, file.getName().length()-6)));}}return classes;}}
随便写一个接口:
publicinterfaceHuman{voidlaugh();voidcry();voidtalk();}
实现类1:
publicclassBlackHumanimplementsHuman{@Overridepublicvoidcry(){
System.out.println("黑人会哭");}@Overridepublicvoidlaugh(){
System.out.println("黑人会笑");}@Overridepublicvoidtalk(){
System.out.println("黑人可以说话,一般人听不懂");}}
实现类2:
publicclassYellowHumanimplementsHuman{@Overridepublicvoidcry(){
System.out.println("黄色人种会哭");}@Overridepublicvoidlaugh(){
System.out.println("黄色人种会大笑,幸福呀!");}@Overridepublicvoidtalk(){
System.out.println("黄色人种会说话,一般说的都是双字节");}}
实现类3:
publicclassWhiteHumanimplementsHuman{@Overridepublicvoidcry(){
System.out.println("白色人种会哭");}@Overridepublicvoidlaugh(){
System.out.println("白色人种会大笑,侵略的笑声");}@Overridepublicvoidtalk(){
System.out.println("白色人种会说话,一般都是但是单字节!");}}
测试代码:
publicclassTest{publicstaticvoidmain(String[] args){
List<Class> concreteHumanList= ClassUtils.getAllClassByInterface(Human.class);for(int i=0; i< concreteHumanList.size(); i++){
System.out.println(concreteHumanList.get(i));}}}
结果截图:
文件目录如下: