Android(安卓)获取接口的所有实现类
Android(安卓)获取接口或者父类所有实现类
本文连接:https://www.cnblogs.com/muphy/p/15150641.html
相信大家都在找Android(安卓)怎么获取接口的所有实现类却怎么也找不到,其实我也找了很久,最后发现很简单
接口:IService
public interface IService { } public class ServiceImpl implements IService { } public class ServiceImpl2 implements IService { }
使用方式:
工具类:ClassUtils.java
package me.muphy.android.mqtt.demo; import android.content.Context; import java.io.IOException; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import dalvik.system.DexFile; public class ClassUtils { //给一个接口,返回这个接口的所有实现类 public static List<Class> getAllClassByInterface(Context context, Class c) { List<Class> returnClassList = new ArrayList<>(); //返回结果 //如果不是一个接口,则不做处理 if (c.isInterface()) { String packageName = c.getPackage().getName(); //获得当前的包名 try { List<Class> allClass = getClasses(context, 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包中不能查找 private static List<Class> getClasses(Context context, String packageName) throws ClassNotFoundException, IOException { List<String> dexFileClassNames = getDexFileClassNames(context, packageName); ArrayList<Class> classes = new ArrayList<>(); for (String s : dexFileClassNames) { try { Class scanClass = Class.forName(s); classes.add(scanClass); } catch (Exception e) { continue; } } return classes; } public static List<String> getDexFileClassNames(Context context, String packageName) throws IOException { DexFile df = new DexFile(context.getPackageCodePath());//通过DexFile查找当前的APK中可执行文件 Enumeration<String> enumeration = df.entries();//获取df中的元素 这里包含了所有可执行的类名 该类名包含了包名+类名的方式 List<String> classes = new ArrayList<>(); while (enumeration.hasMoreElements()) {//遍历 String className = enumeration.nextElement(); if (className.startsWith(packageName)) { classes.add(className); } } return classes; } }