@hirthwork

Тег til в блоге hirthwork

hirthwork

Здравствуйте, мои маленькие любители поебатися с байткодом. Сегодня я вам расскажу о crucial difference различных access specifiers при объявлении мемберов inner-классов.
Слово в сторону: любой порядочный параноик объявит мембер своего класса как private, а не как либо ещё. Крайне ленивый раздолбай вообще access specifier не напишет. И вот тут-то и зарыта собака.
Возьмём вот такой класс с двумя inner-классами:

public class Main {
    class Inner {
        int field;
    }

    class Pinner {
        private int field;
    }

    int test(final Inner obj) {
        return obj.field;
    }

    int test(final Pinner obj) {
        return obj.field;
    }
}

Ничег сложного, просто два inner-класса, у одного поле int, у другого — private int. Ну и из двух разных функций обращаемся к этим полям.
Скомпилим и посмотрим на байткод:

$ javac Main.java
$ javap -p -c Main.class
Compiled from "Main.java"
public class Main {
  public Main();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  int test(Main$Inner);
    Code:
       0: aload_1
       1: getfield      #2                  // Field Main$Inner.field:I
       4: ireturn

  int test(Main$Pinner);
    Code:
       0: aload_1
       1: invokestatic  #3                  // Method Main$Pinner.access$000:(LMain$Pinner;)I
       4: ireturn
}

Ну ничего себе! Было private int простое, а стало золотое — вместо банального getfield получаем invokestatic, который...

$ javap -p -c Main\$Pinner.class
Compiled from "Main.java"
class Main$Pinner {
  private int field;

  final Main this$0;

  Main$Pinner(Main);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #2                  // Field this$0:LMain;
       5: aload_0
       6: invokespecial #3                  // Method java/lang/Object."<init>":()V
       9: return

  static int access$000(Main$Pinner);
    Code:
       0: aload_0
       1: getfield      #1                  // Field field:I
       4: ireturn
}

... внутри уже сам делает getfield, т.е. на ровном месте получили лишний вызов функции. А ещё когда вы сделаете что-то вроде:

Pinner pinner = null;
return pinner.field;

То в стектрейсе NullPointerException вы получите лишний фрейм с этим самым Main$Pinner.access$000, который неопытного программиста просто вводит в ступор.

В общем, я сейчас борюсь с желанием повсюду в коде поудалять все private.

hirthwork

Учимся говорить ентерпрайзно:
Вместо «ракета взорвалась» — rapid unscheduled disassembly

hirthwork

s/pattern\(.\)/\L\1/g — приведёт символ после pattern к нижнему регистру
Очень удобно, когда массово переименовываешь camelCase переменные убирая первую часть имени

hirthwork

Запросы без заголовка Host: nginx сразу реджектит с 400 Bad Request

hirthwork

new test tl;dr: test который не выставляет exit code в 1 если проверка зафейлилась.

hirthwork

Когда делаешь в shell-скриптах <<<, то создаётся временный файл. Называется он here-document или heredoc. Но это абсолютно неважно, если у тебя в $TMPDIR кончилось место.

hirthwork

ncdu -x /

hirthwork

The <font> tag is not supported in HTML5. Use CSS instead.

hirthwork

/etc/issue

hirthwork

Function names are case-insensitive
Нет, ну ёб твою мать...

hirthwork

Чёрный дятел, которого я сегодня утром видел, называется желна́.

hirthwork
hirthwork

set -o pipefail

hirthwork

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

hirthwork

TIL, что те гирлянды мелких колонок, что висят по бокам сцены в йотаспейсе называются "линейный массив"

hirthwork

смотрите какая онлайн-пепяка для пердоленья в геометрию: https://www.geogebra.org/geometry // да, я при помощи её доказываю себе валидность некоторых решений в Евклидии

hirthwork

Кукушек Мидвича написал Джон Уиндем, тот же самый автор что и День Триффидов

hirthwork
hirthwork

Если выходить из mpv по Q, а не q, то он сохранит текущую позицию в ~/.config/mpv/watch_later/ и автоматически начнёт проигрывание файла с этой позиции в следующий раз. Готово для десктопа. А то я каждый раз по пьяни не досматриваю фильм, а на следующий день не помню где закончил

hirthwork

Оказывается, при выбросе исключения деструкторы объектов будут вызваны только если эксепшен был пойман в catch. В противном случае вызов деструкторов implementation-defined. И тебе может не понравиться тот define, который выбрал твой implementation, %username%. Пруф: https://stackoverflow.com/a/39963032

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.