2017-04-19 45 views
-2

我有很多java项目,我想在我的整个代码中找到双重算术运算(+, - ,*,/)。例如,我想从下面的代码中找到a + b行。一旦代码返回所有结果,我将手动将它们更改为一些API。任何人都知道如何编写一个返回所有这些用法的程序?找到下面结果的代码不一定要写成java。我没有发现这个问题在stackoverflow或谷歌,请发布它,如果你找到任何。找到我的java代码中的双重算术运算

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

使用Intellij的结构搜索。 –

+0

你可以在eclipse中搜索正则表达式吗? '[az] \ s?[\ +,\ - ,\ * \\] \ s?[az]'将会找到(+, - ,*,/)的所有运算,在变量名称和操作之间有或没有空格。 – kkflf

+1

正则表达式搜索给予各种+操作,包括对整数,字符串等进行的操作,这是很多噪音 –

回答

4

double作业层有自己的bytecode instructionsdaddddivdmul等,所以,你可以搜索你的项目的类文件的操作。

我确定有工具可以做到这一点,所以寻找那些。

但是,如果你找不到合适的东西,建立你自己的并不难。在已编译的类上,可以使用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

谢谢@ T.J。克劳德。你真的帮了! –

2

您可以使用Refaster,谷歌的errorprone的一部分。 (披露:我为Google工作,并定期使用此工具,还有其他工具存在,我从未在现实世界中使用过它,所以我不知道在工具链中使用它有多困难)。

你可以写一个简单的refaster规则是这样的:

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; } 
} 

将匹配如双操作:

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?从来没有听说过他。 ;-)'公共类ErrorProneJavaCompiler' - 大声笑! –