Краткий ответ
И метод, и все вызовы к нему просто исчезают. Это может быть хорошей идеей для ведения журналов, поскольку каждая инфраструктура журналирования вносит некоторые накладные расходы при вызове журналирования, но данный уровень отключен (вычисление эффективного уровня и подготовка аргументов).
Обратите внимание, что современные каркасы ведения журналов стараются максимально сократить этот объем (например, Logback оптимизирует is*Enabled()
вызовы и SLF4S передает сообщение по имени, чтобы избежать ненужных конкатенаций строк).
Длинный
Мой тестовый код:
import scala.annotation.elidable
import scala.annotation.elidable._
class Foobar {
info()
warning()
@elidable(INFO) def info() {println("INFO")}
@elidable(WARNING) def warning() {println("WARNING")}
}
Доказывает, что при -Xelide-below 800
оба оператора печатаются, а при 900
отображается только "WARNING"
. Так что же происходит под капотом?
$ scalac -Xelide-below 800 Foobar.scala && javap -c Foobar
public class Foobar extends java.lang.Object implements scala.ScalaObject{
public void info();
//...
public void warning();
//...
public Foobar();
Code:
0: aload_0
1: invokespecial #26; //Method java/lang/Object."<init>":()V
4: aload_0
5: invokevirtual #30; //Method info:()V
8: aload_0
9: invokevirtual #32; //Method warning:()V
12: return
}
Как вы можете видеть, это компилируется нормально. Однако при использовании этой инструкции:
$ scalac -Xelide-below 900 Foobar.scala && javap -c Foobar
вызывает info()
и сам метод исчезает из байт-кода :
public class Foobar extends java.lang.Object implements scala.ScalaObject{
public void warning();
//...
public Foobar();
Code:
0: aload_0
1: invokespecial #23; //Method java/lang/Object."<init>":()V
4: aload_0
5: invokevirtual #27; //Method warning:()V
8: return
}
Я ожидаю, что NoSuchMethodError
генерируется во время выполнения, когда удаленный метод вызывается из клиентского кода, скомпилированного для версии Foobar
с более низким порогом elide-below
. Кроме того, он пахнет как старый добрый препроцессор C, и поэтому я дважды подумал бы, прежде чем использовать @elidable
.