Java Reflections不适用于Android即时运行

时间:2016-06-02 01:38:17

标签: android android-studio gradle google-reflections android-instant-run

我正在编写一些使用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.*

的包中

为什么我在应用包中看不到类?!

1 个答案:

答案 0 :(得分:0)

如果您将看到&#34; packageCodePath&#34;在Instant Run部署和简单安装之后的值,您可以看到值不同。

例如,在我的项目中,我看到了类似的内容:

location /

之后我在DexFile实例中观看了mNameList,我很惊讶它在这两种模式中有所不同!在即时运行模式下,我只观看了大约30个课程,而不是即时运行模式。

我不知道该过程的深层细节,但我认为它是由Instant Run的意识形态引起的,取代了修改过的类。

也许我的回答对你有用。