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

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM