在gradle中使用Paranamer生成参数名称数据

时间:2017-10-09 12:00:20

标签: java android gradle reflection

我想在我的android应用程序中获取类的参数名称。向help()方法提供输入,该方法将打印所有可用方法及其参数类型和名称。要获取参数名称,我正在尝试使用paranamer jar。我添加了paranamer.jar作为模块库,我可以导入和使用它。但是不知道如何插入gradle以便生成参数名称数据。有人帮忙吗? Java代码 -

public void help() {
    Method[] declaredMethods = myclass.class.getDeclaredMethods();
    Paranamer paranamer = new CachingParanamer();
    for (Method declaredMethod : declaredMethods) {

        String[] parameterNames = paranamer.lookupParameterNames(declaredMethod, false);
//process paranamer.

    }
}

1 个答案:

答案 0 :(得分:1)

使用他们的Ant任务,Ant整齐地集成在Gradle中:https://docs.gradle.org/current/userguide/userguide_single.html#sec:using_custom_ant_tasks

应该像

configurations {
    paranamer
}

dependencies {
    paranamer 'com.thoughtworks.paranamer:paranamer-ant:2.8'
}

compileJava.doLast {
    ant.taskdef name: 'paranamer',
                classname: 'com.thoughtworks.paranamer.ant.ParanamerTask',
                classpath: configurations.paranamer.asPath
    ant.paranamer(classdir: destinationDir) {
        source.addToAntBuilder ant, 'fileset', FileCollection.AntType.FileSet
    }
}

我没有测试过这个,我没有使用paranamer,我只是从文档和源代码中做出来的。 destinationDirsource不能被实际字符串替换,而是编译任务的字段。

我将此作为compileJava任务的附加操作而不是自己的任务,因为它修改了编译任务就地生成的类文件,并且单独的任务将涉及复制类文件某处,运行paranamer,然后关心修改后的文件是打包而不是原始文件。如果paranamer任务将就地修改compileJava任务的结果,那么它将破坏增量构建,因为compileJava任务将始终是过时的并且每次都运行。我建议的方式,它是compileJava任务的一部分,因此在最新的检查逻辑之前完成,因此在这方面应该完美无缺。

如果您有多个源集或自定义JavaCompile任务,并且想要修改所有这些任务,则会改为:

tasks.withType(JavaCompile) {
    it.doLast {
        ...
    }
}