Как сохранить имена аргументов интерфейса после компиляции в Java?

Я хочу сохранить имена аргументов методов интерфейса после компиляции в Java.

Ниже приведен пример.

Перед компиляцией:

interface IFoo {
    void hello(String what);
}

После компиляции с использованием javac -g:vars IFoo.java

interface IFoo {
    void hello(String str);
}

Аргумент, what переименован в str.

Как сохранить имена аргументов?

Ответ 1

Аргумент или локальная переменная не имеют имени, а всего числа.

Я считаю, что аргумент командной строки для добавления локальных имен переменных - -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 значения.

Ответ 2

При компиляции необходимо создать отладочную информацию. Это вариант Javac -g:

-g - Генерирует всю информацию об отладке, включая локальные переменные.


Если вы используете Maven, вы можете установить <debug>true</debug> в конфигурации плагина компилятора.