如何在Java中保存编译后接口的参数名?

如何在Java中保存编译后接口的参数名?,java,interface,javac,Java,Interface,Javac,我想在Java中编译后保留接口方法的参数名 下面是一个例子 编制前: interface IFoo { void hello(String what); } 使用javac-g:vars IFoo.java编译后 interface IFoo { void hello(String str); } 参数what重命名为str 如何保留参数名称?参数或局部变量没有名称,只有一个数字 我相信添加局部变量名的命令行参数是-parameters,以启用通过反射的访问 反编译器的工作是

我想在Java中编译后保留接口方法的参数名

下面是一个例子

编制前:

interface IFoo {
    void hello(String what);
}
使用
javac-g:vars IFoo.java编译后

interface IFoo {
    void hello(String str);
}
参数
what
重命名为
str


如何保留参数名称?

参数或局部变量没有名称,只有一个数字

我相信添加局部变量名的命令行参数是
-parameters
,以启用通过反射的访问

反编译器的工作是确定/猜测变量名。我用的是蕨类植物,它做的工作很合理

输入

import java.util.stream.stream;
接口IFoo{
公共摘要void hello(字符串what);
公共静态无效打印(字符串…参数){
Stream-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);
    }
}
//
//IntelliJ IDEA从.class文件重新创建的源代码
//(由Fernflower反编译器提供动力)
//
导入java.io.PrintStream;
导入java.util.function.Consumer;
导入java.util.stream.stream;
接口IFoo{
无效hello(字符串what);
静态无效打印(字符串…参数){
Stream-Stream=Stream.of(args);
PrintStream var10001=系统输出;
System.out.getClass();
forEach(var10001::println);
}
}
注意:
System.out.getClass()
javac
编译器生成,用于测试
null
值。

编译时需要生成调试信息。 这就是选项
-g
的作用:

-g
-生成所有调试信息,包括局部变量



如果您使用的是Maven,则可以在中设置
true

虽然它对类方法和静态接口方法都很有吸引力,但对非静态接口方法却不起作用。
//
// 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);
    }
}