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

时间:2018-09-19 07:58:44

标签: java interface javac

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

下面是一个例子。

编译前:

interface IFoo {
    void hello(String what);
}

使用javac -g:vars IFoo.java

编译后
interface IFoo {
    void hello(String str);
}

自变量what重命名为str

如何保留参数名称?

2 个答案:

答案 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>