我有很多java项目,我想在我的整个代码中找到双重算术运算(+, - ,*,/)。例如,我想从下面的代码中找到a + b
行。一旦代码返回所有结果,我将手动将它们更改为一些API。任何人都知道如何编写一个返回所有这些用法的程序?找到下面结果的代码不一定要写成java。我没有发现这个问题在stackoverflow或谷歌,请发布它,如果你找到任何。找到我的java代码中的双重算术运算
double a = 0.0, b=0;
if(a+b > 0){
...
我有很多java项目,我想在我的整个代码中找到双重算术运算(+, - ,*,/)。例如,我想从下面的代码中找到a + b
行。一旦代码返回所有结果,我将手动将它们更改为一些API。任何人都知道如何编写一个返回所有这些用法的程序?找到下面结果的代码不一定要写成java。我没有发现这个问题在stackoverflow或谷歌,请发布它,如果你找到任何。找到我的java代码中的双重算术运算
double a = 0.0, b=0;
if(a+b > 0){
...
上double
作业层有自己的bytecode instructions:dadd
,ddiv
,dmul
等,所以,你可以搜索你的项目的类文件的操作。
我确定有工具可以做到这一点,所以寻找那些。
但是,如果你找不到合适的东西,建立你自己的并不难。在已编译的类上,可以使用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 }
所以,你可以写一个程序:
获取javap -c
输出每个班级
查看的输出- 相关字节码指令(相当简单的正则表达式的工作)
谢谢@ T.J。克劳德。你真的帮了! –
您可以使用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.克罗德的示例代码)。
所以,不是很难!
**不错** ....... –
@ T.J.Crowder是的,它真的超级。它是由Louis Wasserman写的,我想你已经看过这些部分。 –
Wasserwho?从来没有听说过他。 ;-)'公共类ErrorProneJavaCompiler' - 大声笑! –
使用Intellij的结构搜索。 –
你可以在eclipse中搜索正则表达式吗? '[az] \ s?[\ +,\ - ,\ * \\] \ s?[az]'将会找到(+, - ,*,/)的所有运算,在变量名称和操作之间有或没有空格。 – kkflf
正则表达式搜索给予各种+操作,包括对整数,字符串等进行的操作,这是很多噪音 –