Как java компилирует добавление операции Strings в использование StringAppend и как можно определить поведение операции для создаваемого объекта следующим образом - PullRequest
0 голосов
/ 20 марта 2020

---------- Обновлено -------

Я думал, что это не будет так быстро, но оказалось, что он может просто так работать без проблем.

Это просто работает для автомобиля String a = "abc" + 'c';, а также String a = "abc" + "a";

Я изучил исходные коды классов String и CharSequence, но не нашел точный метод, который позволяет этот сценарий .

Кроме того, я сомневаюсь, что может быть что-то вроде переопределения оператора "+" плюс для String или char, но я не знаю, где искать подсказки.

Я сомневался таким образом, потому что я также являюсь пользователем python в течение нескольких лет, и существует сценарий переопределения магических функций c, таких как python __add__, который определяет действие объекта, когда он действует как операнд "+" или добавьте операцию. Я просто хочу знать, где я могу найти ключ к java компиляции String a = "abc" + 'c'; в использовании StringBuilder.append(). Я просто хочу увидеть, где происходит этот процесс. Но, зная это, я думаю, что могу знать, как включить действие самосозданных объектов, когда они являются операндами некоторой базовой операции c.

Большое спасибо заранее.

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Я изучил исходные коды классов String и CharSequence, но не нашел точного метода, который включает этот сценарий.

Вы ищете не в том месте.

Кроме того, я сомневаюсь, что может быть что-то вроде переопределения оператора «+» плюс для String или char, но я не знаю, где искать подсказки.

Места для поиска:

  • Байт-коды, испускаемые компилятором байт-кода. Вы можете проверить их, используя команду javap. Используйте опцию -c, чтобы увидеть дизассемблированные байт-коды.
  • Спецификация языка Java (JLS) говорит, что именно означает +, и объясняет, как компилятору Java разрешено преобразовывать + во множество различных последовательностей вызовов String методов. Раздел для чтения: JLS 15.18.1
  • Исходный код самого компилятора Java; т.е. javac или сторонний эквивалент. Это даст окончательный logi c, который используется компилятором при принятии решения о том, как переводить оператор строки +.

На самом деле, вышеизложенное относится к Java 8 и ранее. В Java 9 / JEP 280 они изменили вещи для использования последовательностей конкатенации от invokedynamic до express, чтобы компилятор JIT имел больше свободы для оптимизации фактических вызывающих последовательностей. См .:

В Java 9 или более поздней версии вам нужно будет посмотреть на собственный код, генерируемый JIT-компилятором, чтобы увидеть, как на самом деле реализована конкатенация.


Кроме того, поскольку я обновил, я сомневался в этом из-за того, что переопределенные методы magi c, такие как __add__ в python, могут определять поведение объектов, когда он выполняет действие add. Что похоже на меня, учитывая конкатенацию строк в java.

Не пытайтесь понять реализацию Java с точки зрения вашего знания Python. Языки и их реализации очень разные. Для начала, Java не имеет эквивалента Python __ методов (кроме __init__). Приложения Java не могут перегружать операторов.

Вместо этого прочитайте язык Java и спецификации виртуальных машин.

1 голос
/ 20 марта 2020

Компилятор Java прозрачно преобразует выражения вроде

String str3 = str1 + str2;

в

StringBuilder sb = new StringBuilder();
sb.append(str1).append(str2);
str3 = sb.toString();

Поскольку StringBuilder имеет методы сопоставления для многих типов данных, включая char, можно объединить String и char с помощью оператора +.

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