Никита Савченко, элементарно, надо написать код, который принимает ссылку, скачивает по ней страницу, заменяет все ссылки в странице на ссылки на себя, отдаёт обработанную страницу клиенту.
Василий Банников, сходу не вспомню, но между Java 8 и Java 18 несколько раз менялся формат class-файлов, добавлялись новые байткоды и появлялись новые функции виртуальной машины, типа Memory API. Чисто с инженерной точки зрения мешает то, что какой-нибудь там паттерн-матчинг выполняется в рантайме, соответственно виртуальная машина должна уметь его выполнять.
Василий Банников, обратная совместимость работает при использовании того же набора функций. То есть можно скомпилировать код с помощью JDK 18 и запустить на JDK 8, если использовались функции только JDK 8. Исключение только для синтаксического сахара.
diaskinkotakbaskin, long pollong, SSE, WebSocket. Но они потребуют от сервиса держать множество параллельных соединений, что для некоторых серверов/приложений может быть проблемнее, чем обслуживать 25k RPS.