Есть ли способ написать метод Java, как toString в Javascript, который при вызове метода печатает исходный код метода? - PullRequest
0 голосов
/ 25 февраля 2019

Извините, если это тривиальный вопрос, поэтому, если он уже был задан, направьте меня к этому вопросу.

Я знаю, что метод tostring в javascript, при вызове функции, напечатает исходный код (подробнее об этом: ссылка ).Можно ли сделать то же самое в Java?

Так что, если у меня есть следующее определение функции идентификации:

public class class1 {

    int f1(int x){
        return  x;
    }
}

И следующая основная функция:

class Main {
    public static void main(String args[]) {

        class1 c1 = new class1();

        ???? 

    }
}

Есть ли что-нибудь, что я могу поставить вместо «????»это напечатало бы что-то вроде

int f1(int x){
    return  x;
}

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вероятно, да, но не тривиальный с готовой командой.JavaScript - это интерпретируемый язык, где исполняющая среда имеет доступ к исходному коду в его первоначальном виде.Именно так вы можете проверить его в консоли браузера и увидеть те же имена переменных, что и в исходном коде.

Хотя скомпилированное / интерпретированное различие нечетко для Java , оно определенноизменено перед исполнением.Байт-код , используемый Java-компиляцией Just-in-Time, может быть более читабельным, чем полностью скомпилированный двоичный файл, он не является источником.Если запущенная программа не имеет доступа к исходному коду, она менее способна вывести его.Отладчик, работающий в IDE, может ссылаться на проблемы в источнике;в противном случае вы ограничены отладкой байт-кодов .

Именно поэтому Кено Клейтон предложил вопрос о программах Quine, которые предназначены для воспроизведения самих себя. Этот ответ выводит исходный код путем его жесткого кодирования в качестве атрибута класса.Вы могли бы использовать аналогичный подход со скриптом предварительной компиляции, который прошел через все методы и сделал строки из их источников, но результат был бы громоздким и потенциально чувствительным.

0 голосов
/ 25 февраля 2019

Отказ от ответственности: я не эксперт по Java или любому другому языку программирования в этом отношении.Тем не менее, я знаю, как найти информацию в Интернете.

Эта концепция в Java кажется неосуществимой.Для начала:

JavaScript является интерпретируемым языком, а не скомпилированным языком. Программа, такая как C ++ или Java , должна быть скомпилирована до ее запуска,Исходный код передается через программу, называемую компилятором, которая переводит его в байт-код, который машина понимает и может выполнить.В отличие от JavaScript не имеет этапа компиляции.Вместо этого интерпретатор в браузере читает код JavaScript, интерпретирует каждую строку и запускает ее.В более современных браузерах используется технология, известная как компиляция Just-In-Time (JIT), которая компилирует JavaScript в исполняемый байт-код в момент его запуска.

В основном, JavaScript имеет преимущество чтения напрямуюиз файла с исходным кодом и запуска его на лету.Скомпилированные языки, такие как Java, не будут иметь такую ​​функциональность, встроенную по умолчанию, по многим причинам, включая безопасность.Приложение должно иметь возможность работать, не позволяя хакерам получить доступ к своему исходному коду в максимально возможной степени.

Были попытки сделать различные формы того, что вас интересует, но, похоже, два самых простых метода:

  1. Печать оригинального .java файла построчно
  2. Хранение строковой ссылки на весь код или требуемый метод (ы).

Также представляется возможным напечатать имя метода, но не тело.

Кроме этого, единственное, что вы можете получить из скомпилированной, работающей java-программы, - это байт-код, для которого потребуется декомпиляторчтобы иметь хоть какую-то надежду на понимание источника, стоящего за этим.

Вы можете продолжить чтение по нему, воспользовавшись несколькими ссылками здесь:

Как отражать тело метода рефлексивно?

Сохранить метод в переменную, java 8

Просмотреть реализацию метода (тело метода) с помощью Java Reflection

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...