热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android(安卓)获取接口的所有实现类

本文连接: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;
}
}

 



推荐阅读
author-avatar
不会游泳的小饼儿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有