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

2022-09-04 04:22:03

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

下面是一个示例。

编译之前:

interface IFoo {
    void hello(String what);
}

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

interface IFoo {
    void hello(String str);
}

该参数将重命名为 。whatstr

如何保留参数名称?


答案 1

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

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


如果您使用的是 Maven,则可以在编译器插件的配置中进行设置。<debug>true</debug>


答案 2

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

我相信添加局部变量名称的命令行参数是通过反射启用访问 https://www.beyondjava.net/reading-java-8-method-parameter-named-reflection-parameters

反编译器的工作是确定/猜测变量名称。我使用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);
    }
}

使用蕨类植物的输出

//
// 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();javacnull