在Java中编译后,我想保留接口方法的参数名称。
下面是一个例子。
编译前:
interface IFoo {
void hello(String what);
}
使用javac -g:vars IFoo.java
interface IFoo {
void hello(String str);
}
自变量what
重命名为str
。
如何保留参数名称?
答案 0 :(得分:3)
参数或局部变量没有名称,只有一个数字。
我认为添加局部变量名称的命令行参数为-parameters
,以启用通过反射https://www.beyondjava.net/reading-java-8-method-parameter-named-reflection进行访问
确定/猜测变量名是反编译器的工作。我用Fernflower做得很好。
输入
import java.util.stream.Stream;
interface IFoo {
public abstract void hello(String what);
public static void print(String... args) {
Stream<String> stream = Stream.of(args);
stream.forEach(System.out::println);
}
}
使用Fernflower输出
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
import java.io.PrintStream;
import java.util.function.Consumer;
import java.util.stream.Stream;
interface IFoo {
void hello(String what);
static void print(String... args) {
Stream<String> stream = Stream.of(args);
PrintStream var10001 = System.out;
System.out.getClass();
stream.forEach(var10001::println);
}
}
注意:System.out.getClass();
由javac
编译器生成,用于测试null
的值。
答案 1 :(得分:3)
编译时,您需要生成调试信息。
这就是Javac选项-g
的作用:
-g
-生成所有调试信息,包括局部变量。
如果使用的是Maven,则可以在compiler plugin's configuration中设置<debug>true</debug>
。