2017-10-09 9 views
0

私のアンドロイドアプリケーション内でクラスのパラメータ名を取得しようとしています。使用可能なすべてのメソッドとそのパラメータのタイプと名前を出力するhelp()メソッドに入力を供給します。パラメータ名を取得するには、私はparanamer jarを使用しようとしています。 paranamer.jarをモジュールライブラリとして追加しました。インポートして使用することができます。しかし、にパラメータ名データを生成するために、どのようにgradleにプラグインするのか分かりません。誰でも助けてくれますか? Javaはパラメータ名のデータを生成するために、paranamerをgradleで使用する

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

が自分の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 
    } 
} 

のようなものでなければならず、私はしないでください私はちょうどドキュメントとソースからこれを作った。 destinationDirおよびsourceは、実際の文字列ではなく、コンパイルタスクのフィールドです。

これは、コンパイルタスクによって生成されたクラスファイルをインプレースで変更し、別のタスクを使用してクラスファイルをどこかにコピーして実行することになるため、独自のタスクではなくcompileJavaタスクに追加アクションとしてこれを行いました元のファイルの代わりに変更されたファイルがパッケージ化されているかどうかを確認します。 paranamerタスクがcompileJavaタスクの結果をインプレースで変更すると、compileJavaタスクは常に古くなり、毎回実行されるため、増分ビルドが中断されます。私が提案する方法では、それはcompileJavaタスクの一部であり、最新のチェックロジックの前に行われるため、この点で問題なく動作するはずです。

あなたは複数のソース・セットまたはカスタムJavaCompileタスクを持っており、それらのすべてを変更したい場合は、代わりのようなものでしょう:

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

私はアプリモジュールのbuild.gradleファイルに同じを追加することで同じことを試してみました。私のプロジェクトに外部ライブラリとしてparanamer-antとgenerator jarを追加しました。 、コンパイルされました。すべてがよさそうだ。しかし、パラメータルックアップはnullを返します。何か問題でも。私はもっ​​と掘っています。お返事をありがとうございます。 – Rilwan

+0

'paranamer-generator'は' paranamer-ant'の依存関係ですので、明示的に追加する必要はありません。これがAndroidで動作するはずですか?おそらく、Androidのビルドチェーンは、ジェネレータが何をしたかをもう一度取り除くでしょうか – Vampire

+0

私は最終的なapkを逆コンパイルし、チェックしました、paranemerのREADMEによると、私たちがantのparanamer-generatorを使用している場合、最終クラスファイルには変数 '__PARANAMER_DATA'が含まれているはずです。残念ながら、そのような変数はありません。私はまだ何が間違っているか把握していません。 – Rilwan

関連する問題