Как сохранить имена аргументов интерфейса после компиляции в Java? - PullRequest
0 голосов
/ 19 сентября 2018

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

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

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

interface IFoo {
    void hello(String what);
}

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

interface IFoo {
    void hello(String str);
}

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

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

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Вам нужно сгенерировать отладочную информацию при компиляции.Вот что делает опция Javac -g:

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


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

0 голосов
/ 19 сентября 2018

У аргумента или локальной переменной нет имени, только число.

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

...