如何在Java编译后保留接口的参数名称?

Bai*_*ong 13 java interface javac

我希望在Java编译后保留接口方法的参数名称.

以下是一个例子.

编译之前:

interface IFoo {
    void hello(String what);
}
Run Code Online (Sandbox Code Playgroud)

编译后使用 javac -g:vars IFoo.java

interface IFoo {
    void hello(String str);
}
Run Code Online (Sandbox Code Playgroud)

该参数what重命名为str.

我怎样才能保留参数名称?

Pet*_*rey 4

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

我相信添加局部变量名称的命令行参数是-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);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:System.out.getClass();由编译器生成javac以测试null值。