作者:不会游泳的小饼儿 | 来源:互联网 | 2023-06-01 19:04
本文连接:https:www.cnblogs.commuphyp15150641.html相信大家都在找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 getAllClassByInterface(Context context, Class c) {
List returnClassList = new ArrayList<>(); //返回结果
//如果不是一个接口,则不做处理
if (c.isInterface()) {
String packageName = c.getPackage().getName(); //获得当前的包名
try {
List allClass = getClasses(context, packageName); //获得当前包下以及子包下的所有类
//判断是否是同一个接口
for (int i = 0; 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 getClasses(Context context, String packageName) throws ClassNotFoundException, IOException {
List dexFileClassNames = getDexFileClassNames(context, packageName);
ArrayList 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 getDexFileClassNames(Context context, String packageName) throws IOException {
DexFile df = new DexFile(context.getPackageCodePath());//通过DexFile查找当前的APK中可执行文件
Enumeration enumeration = df.entries();//获取df中的元素 这里包含了所有可执行的类名 该类名包含了包名+类名的方式
List classes = new ArrayList<>();
while (enumeration.hasMoreElements()) {//遍历
String className = enumeration.nextElement();
if (className.startsWith(packageName)) {
classes.add(className);
}
}
return classes;
}
}