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; } }