关于Java和Android中ClassLoader路径的问题

以Android开发为例,环境为AndroidStudio2.2,我的项目目录结构为



那么我在填写路径的时候有两种写法:

1、Car.class.getClassLoader().getResourceAsStream("/debug/com/zcj/javaproperties/Car");

2、Car.class.getClassLoader().getResourceAsStream("Car");

即:当路径以 “/” 开头的时候,表示从编译目录的classes下为起点;否则表示从当前包下为起点。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android,可以使用Java的反射机制获取某个应用程序加载的所有类。以下是一个示例代码: ```java import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Build; import android.util.Log; import java.lang.reflect.Field; import java.util.HashSet; import java.util.Set; public class LoadedClasses { public static Set<String> getAllLoadedClasses(Context context, String packageName) { Set<String> classNames = new HashSet<>(); try { ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(packageName, 0); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { ClassLoader classLoader = context.getClassLoader(); Field pathListField = classLoader.getClass().getDeclaredField("pathList"); pathListField.setAccessible(true); Object dexPathList = pathListField.get(classLoader); Field dexElementsField = dexPathList.getClass().getDeclaredField("dexElements"); dexElementsField.setAccessible(true); Object[] dexElements = (Object[]) dexElementsField.get(dexPathList); for (Object dexElement : dexElements) { Field dexFileField = dexElement.getClass().getDeclaredField("dexFile"); dexFileField.setAccessible(true); Object dexFile = dexFileField.get(dexElement); Method entriesMethod = dexFile.getClass().getDeclaredMethod("entries"); Object entriesObject = entriesMethod.invoke(dexFile); if (entriesObject instanceof Enumeration) { Enumeration<String> entries = (Enumeration<String>) entriesObject; while (entries.hasMoreElements()) { String entry = entries.nextElement(); classNames.add(entry.replace("/", ".")); } } } } else { String apkPath = appInfo.sourceDir; ClassLoader classLoader = LoadedClasses.class.getClassLoader(); Field pathListField = classLoader.getClass().getSuperclass().getDeclaredField("pathList"); pathListField.setAccessible(true); Object dexPathList = pathListField.get(classLoader); Field dexElementsField = dexPathList.getClass().getDeclaredField("dexElements"); dexElementsField.setAccessible(true); Object[] dexElements = (Object[]) dexElementsField.get(dexPathList); for (Object dexElement : dexElements) { Field dexFileField = dexElement.getClass().getDeclaredField("dexFile"); dexFileField.setAccessible(true); Object dexFile = dexFileField.get(dexElement); Method getNameMethod = dexFile.getClass().getDeclaredMethod("getName"); String dexFileName = (String) getNameMethod.invoke(dexFile); if (!apkPath.equals(dexFileName)) { continue; } Method entriesMethod = dexFile.getClass().getDeclaredMethod("entries"); Object entriesObject = entriesMethod.invoke(dexFile); if (entriesObject instanceof Enumeration) { Enumeration<String> entries = (Enumeration<String>) entriesObject; while (entries.hasMoreElements()) { String entry = entries.nextElement(); classNames.add(entry.replace("/", ".")); } } } } } catch (Throwable e) { Log.e("LoadedClasses", "Failed to get all loaded classes", e); } return classNames; } } ``` 这个类定义了一个静态方法`getAllLoadedClasses()`,它接收一个`Context`对象和一个应用程序包名作为参数,返回这个应用程序加载的所有类的类名的集合。这个方法通过反射机制获取应用程序的APK文件路径,然后使用DexClassLoader加载APK的所有类,并遍历所有类获取其类名。需要注意的是,这个方法只能获取已经被加载的类,如果有动态加载的类可能无法被获取到。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值