我正在编写一些使用java反射的代码。我使用这种方法扫描我的包裹以获得某个类:
/**
* Called to get list of classes included in the current project
*
* @param packageName the name of application package
* @return array of classes' names
*/
private String[] getClassesOfPackage(String packageName) {
ArrayList<String> classes = new ArrayList<>();
try {
String packageCodePath = getPackageCodePath();
DexFile df = new DexFile(packageCodePath);
for (Enumeration<String> iter = df.entries(); iter.hasMoreElements(); ) {
String className = iter.nextElement();
if (className.contains(packageName)) {
classes.add(className);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return classes.toArray(new String[classes.size()]);
}
最近我将Gradle
版本升级为2.1.0
以尝试即时运行功能,但我注意到我的应用包通常会从此方法返回空String[]
,此方法仅返回类在名为com.android.tools.fd.*
为什么我在应用包中看不到类?!
答案 0 :(得分:0)
如果您将看到&#34; packageCodePath&#34;在Instant Run部署和简单安装之后的值,您可以看到值不同。
例如,在我的项目中,我看到了类似的内容:
location /
之后我在DexFile实例中观看了mNameList,我很惊讶它在这两种模式中有所不同!在即时运行模式下,我只观看了大约30个课程,而不是即时运行模式。
我不知道该过程的深层细节,但我认为它是由Instant Run的意识形态引起的,取代了修改过的类。
也许我的回答对你有用。