Есть ли встроенные функции в Java? - PullRequest
104 голосов
/ 19 января 2010

Есть ли концепция встроенных функций в Java или что-то еще?Если есть, как это используется?Я слышал, что методы public, static и final являются встроенными функциями.Можем ли мы создать нашу собственную встроенную функцию?

Ответы [ 8 ]

117 голосов
/ 19 января 2010

В Java оптимизация обычно выполняется на уровне JVM. Во время выполнения JVM выполняет некоторый «сложный» анализ, чтобы определить, какие методы встроить. Он может быть агрессивным при встраивании, и JVM Hotspot может встраивать не финальные методы.

Java-компиляторы почти никогда не вставляют вызовы какого-либо метода (JVM делает все это во время выполнения). Они выполняют встроенные постоянные времени компиляции (например, конечные значения статических примитивов). Но не методы.

Для дополнительных ресурсов:

  1. Статья: Механизм производительности Java HotSpot: Пример встраивания метода

  2. Wiki: встраивание в OpenJDK , заполнено не полностью, но содержит ссылки на полезные обсуждения.

14 голосов
/ 19 января 2010

Java не предоставляет способ вручную предложить, чтобы метод был встроен. Как говорится в комментариях @notnoop, встраивание обычно выполняется JVM во время выполнения.

12 голосов
/ 19 января 2010

Нет, в Java нет встроенной функции . Да, вы можете использовать публичный статический метод в любом месте кода, если он помещен в публичный класс. Компилятор Java может выполнить встроенное расширение для статического или конечного метода, но это не гарантируется.

Обычно такие оптимизации кода выполняются компилятором в сочетании с JVM / JIT / HotSpot для сегментов кода, которые используются очень часто. Также другие понятия оптимизации, такие как объявление параметров в регистре, не известны в Java.

Оптимизация не может быть принудительно объявлена ​​в Java, но выполняется компилятором и JIT. Во многих других языках эти объявления часто являются только подсказками компилятора (вы можете объявить больше параметров регистра, чем имеет процессор, остальное игнорируется).

Объявление методов Java статическими, финальными или закрытыми также является подсказкой для компилятора. Вы должны использовать его, но без гарантий. Производительность Java динамическая, а не статическая. Первый вызов в системе всегда медленный из-за загрузки класса. Следующие вызовы выполняются быстрее, но в зависимости от памяти и времени выполнения наиболее распространенные вызовы оптимизируются в работающей системе, поэтому сервер может работать быстрее во время выполнения!

4 голосов
/ 19 января 2010

То, что вы сказали выше, правильно. Иногда конечные методы создаются как встроенные, но другого способа явно создать встроенную функцию в java нет.

2 голосов
/ 20 апреля 2016

Ну, есть методы, которые можно назвать "встроенными" методами в Java, но в зависимости от jvm.После компиляции, если машинный код метода меньше 35 байт, он будет сразу передан встроенному методу, если машинный код метода меньше 325 байт, он может быть передан встроенному методу, в зависимости от jvm.

2 голосов
/ 16 октября 2014

Пример из реальной жизни:

public class Control {
    public static final long EXPIRED_ON = 1386082988202l;
    public static final boolean isExpired() {
        return (System.currentTimeMillis() > EXPIRED_ON);
    }
}

Затем в других классах я могу выйти, если срок действия кода истек. Если я ссылаюсь на переменную EXPIRED_ON из другого класса, эта константа является встроенной в байт-код, что очень затрудняет отслеживание всех мест в коде, который проверяет дату истечения срока действия. Однако, если другие классы вызывают метод isExpired (), вызывается фактический метод, то есть хакер может заменить метод isExpired другим, который всегда возвращает false.

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

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

Что касается подтверждения того, что метод из класса элемента управления помещается встроенным в другой класс во время компиляции, попробуйте запустить другой класс без класса Control в пути к классам.

0 голосов
/ 16 января 2018

Java9 имеет компилятор «Ahead of time», который выполняет несколько оптимизаций во время компиляции, а не во время выполнения, что можно рассматривать как встраивание.

0 голосов
/ 05 мая 2017

так что, похоже, нет, но вы можете использовать этот обходной путь, используя guava или эквивалентную реализацию класса Function, потому что этот класс очень прост, например:просто для иллюстрации того, как создать сложный блок кода (внутри {}), чтобы сделать что-то настолько специфичное, что не должно нас беспокоить при создании какого-либо метода для него, встроенного в AKA!

...