2017-04-19 12 views
-2

私は多くのJavaプロジェクトを持っており、私のコード全体で二重算術演算(+、 - 、*、/)を探したいと思います。たとえば、私はa + b行を以下のコードから探したいと思う。コードがすべての結果を返すと、私は手動でいくつかのAPIに変更します。そのような使用法をすべて返すプログラムを書く方法を知っている人はいますか?以下の結果を見つけるためのコードは必ずしもjavaと書かれているとは限りません。私はstackoverflowまたはGoogleでこの質問を見つけることができなかった場合は、それを投稿してください。あなたのプロジェクトのためのクラスファイルにこれらの操作を検索することができますのでdaddddivdmulなど:doubleの上私のJavaコードでdouble算術演算を見つける

double a = 0.0, b=0; 
if(a+b > 0){ 
... 
+0

Intellijの構造検索を使用します。 –

+0

eclipseで正規表現を検索できますか?変数名と操作の間に空白を入れてあるかどうかにかかわらず、(+、 - 、*、/)のすべての演算を見つけるでしょう。[az] \ s?[\ +、\ - 、\ * \\] 。 – kkflf

+1

正規表現検索では、整数、文字列などの処理にノイズが多く含まれているなど、すべての操作が行われています –

答えて

4

操作がbytecode instructions自分自身を持っています。

私はそれを行うためのツールがあると確信していますので、それらを検索してください。

しかし、あなたが適切なものを見つけることができない場合は、自分自身を構築することはあまり難しいことではありません。コンパイルされたクラスでは、javap -c ClassNameを使用して、クラスのバイトコードを人間が判読可能なバージョンにすることができます。たとえば、このコード:

import java.util.Random; 

public class Example { 
    public static void main(String[] args) { 
     Random r = new Random(); 
     double d1 = r.nextDouble(); 
     double d2 = r.nextDouble(); 
     double d3 = d1 + d2; 
     System.out.println(d3); 
    } 
} 

... javap -cからこの出力の結果:

 
Compiled from "Example.java" 
public class Example { 
    public Example(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."":()V 
     4: return 

    public static void main(java.lang.String[]); 
    Code: 
     0: new   #2     // class java/util/Random 
     3: dup 
     4: invokespecial #3     // Method java/util/Random."":()V 
     7: astore_1 
     8: aload_1 
     9: invokevirtual #4     // Method java/util/Random.nextDouble:()D 
     12: dstore_2 
     13: aload_1 
     14: invokevirtual #4     // Method java/util/Random.nextDouble:()D 
     17: dstore  4 
     19: dload_2 
     20: dload   4 
     22: dadd 
     23: dstore  6 
     25: getstatic  #5     // Field java/lang/System.out:Ljava/io/PrintStream; 
     28: dload   6 
     30: invokevirtual #6     // Method java/io/PrintStream.println:(D)V 
     33: return 
} 

だから、あなたがプログラムを書くことができ:

  1. は用javap -c出力を取得します。各クラス

  2. の出力をご覧くださいの関連のバイトコード命令(かなり単純な正規表現の仕事)

+1

Thanks @ T.J。クラウダー。あなたは本当に助けてくれました! –

2

あなたはRefaster、Googleのerrorproneの一部を使用することができます。

(私はGoogleの仕事をしていますが、このツールは定期的に使用してください)他のツールもあります。現実世界で使用したことがないので、ツールチェーンでどれくらい難しいのか分かりません)。

class FindTheDoubleOps { 
    @BeforeTemplate double plus(double a, double b) { return a + b; } 
    @BeforeTemplate double minus(double a, double b) { return a - b; } 
    @BeforeTemplate double times(double a, double b) { return a * b; } 
    @BeforeTemplate double divide(double a, double b) { return a * b; } 
} 

のような二重の操作が一致します:

あなたはこのような単純なrefasterルールを記述することができ

double a = 1.0 + 2.0; 
double b = methodReturningDouble() + Double.NAN; 

など、すなわち多くのあなたが正規表現を見つけることができます以上。

私はここに@AfterTemplateを追加していませんでしたが、あなたは同じような何かを行うことができます注:

class ReplacePlus { 
    @BeforeTemplate double before(double a, double b) { return a + b; } 
    @AfterTemplate double after(double a, double b) { return myPlus(a, b); } 
} 

、そして得られたパッチは、この置換を含んでいます。


私はこの指示に従っています。私はここに追加するドキュメントの有効ビットになるだろう考え出し:

$ wget http://repo1.maven.org/maven2/com/google/errorprone/javac/9-dev-r3297-4/javac-9-dev-r3297-4.jar 
$ wget http://repo1.maven.org/maven2/com/google/errorprone/error_prone_refaster/2.0.18/error_prone_refaster-2.0.18.jar 

$ java -cp javac-9-dev-r3297-4.jar:error_prone_refaster-2.0.18.jar \ 
    com.google.errorprone.refaster.RefasterRuleCompiler \ 
    FindTheDoubleOps.java --out $(pwd)/doubleops.refaster 

$ wget https://repo1.maven.org/maven2/com/google/errorprone/error_prone_ant/2.0.19/error_prone_ant-2.0.19.jar 

$ java -Xbootclasspath/p:error_prone_ant-2.0.19.jar com.google.errorprone.ErrorProneCompiler -XepPatchChecks:refaster:$(pwd)/doubleops.refaster -XepPatchLocation:$(pwd)/patch.patch Example.java 

$ java -Xbootclasspath/p:error_prone_ant-2.0.19.jar com.google.errorprone.ErrorProneCompiler -XepPatchChecks:refaster:$(pwd)/doubleops.refaster -XepPatchLocation:$(pwd) Example.java 
Example.java:8: warning: [FindTheDoubleOps] 
     double d3 = d1 + d2; 
        ^
    Did you mean 'double d3 = /* match found */ d1 + d2;'? 
1 warning 
Apr 19, 2017 9:55:38 AM com.google.errorprone.apply.DiffApplier decrementTasks 
INFO: Completed 1 files in 6.346 ms 
Changes were written to <pwd>/error-prone.patch. Please inspect the file and apply with: patch -p0 -u -i error-prone.patch 

(私は上記のT.J。クラウダーのコード例を使用しました)。

だから、まったく難しくありません!

+0

**ニース** ....... –

+0

@ T.J.Crowderええ、それは本当にスーパーです。これはLouis Wassermanによって書かれました。私はあなたがこれらの部分の周りを見たと思います。 –

+0

Wasserwho?決して彼の玉。 ;-) 'public class ErrorProneJavaCompiler' - LOL! –