Java

Использование Java-плагина

Для запуска Java-апплетов в Debian нужно установить один из пакетов:

Версия Debian Кодовое имя Debian Пакет с плагином для браузера Пакет с javaws
6 Squeeze icedtea6-plugin -
7 Wheezy icedtea6-plugin -
8 Jessie icedtea7-plugin icedtea-netx
9 Stretch - icedtea-netx
10 Buster - icedtea-netx
11 Bullseye - icedtea-netx

Для запуска из браузера удобнее воспользоваться пакетом с плагином:

# apt-get install icedtea7-plugin

Если пакета с плагином нет, то придётся воспользоваться пакетом icedtea-netx:

# apt-get install icedtea-netx

В этом случае нужно скачать через браузер файл Java-апплета с расширением jnlp и запустить его следующим образом:

$ javaws --jnlp application.jnlp

Декомпиляция jar-файлов

Установим распаковщик ZIP-архивов и декомпилятор Java:

# apt-get install unzip procyon-decompiler

Распаковываем:

$ unzip ekicraft.jar

Декомпилируем:

$ procyon ekiInterface/JiAdminPanel.class

Для массовой декомпиляции всех class-файлов можно воспользоваться такой конструкцией:

$ find . -name \*.class | while read class;
do
  java=`echo "$class" | sed 's/class$/java/'`;
  procyon "$class" > "$java";
done

Решение проблем с SSL/TLS

Если Java-приложение отказывается работать, ссылаясь на неподдерживаемую версию SSL/TLS.

Например, если сервер умеет работать только с TLS 1.0, а свежая Java требует поддержки TLS 1.1 или 1.2, то разрешить использовать TLS 1 можно путём редактирования файла /etc/java-11-openjdk/security/java.security. Нас интересует такая строчка:

jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves

В данном случае из неё нужно удалить запрет использовать протоколы TLS версий 1 и 1.1, вот так:

jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves

Если апплет не запускается и сообщает об ошибке верификации JAR-файлов, то может потребоваться изменить вот такую строчку:

jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \
      DSA keySize < 1024, SHA1 denyAfter 2019-01-01, \
      include jdk.disabled.namedCurves

В моём случае оказалось достаточно разрешить использовать алгоритм хэширования SHA1:

jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \
      DSA keySize < 1024, \
      include jdk.disabled.namedCurves

Для того, чтобы разрешить использовать все имеющиеся реализации алгоритмов для любых целей, можно прописать такие опции:

jdk.certpath.disabledAlgorithms=None
jdk.security.legacyAlgorithms=None
jdk.jar.disabledAlgorithms=None
jdk.tls.disabledAlgorithms=None
jdk.tls.legacyAlgorithms=None

Hello world на Java

Устанавливаем JDK:

# apt-get install default-jdk

Создаём файл Test.java со следующим содержимым:

public class Test
{
      public static void main(String args[])
      {
          System.out.println("Hello, world!");
      }
}

Выполняем компиляцию файла Test.java:

$ javac Test.java

В результате компиляции должен получиться файл Test.class. Запустим его:

$ java Test

Запущенная программа должна вывести ожидаемый текст:

Hello, world!

Хорошее объяснение, почему главная функция программы должна быть объявлена именно таким образом, можно найти в статье public static void main(String[] args) – Java main method.

Типы переменных

Элементарные типы переменных перечислены в таблице ниже:

Группа Тип данных Диапазон допустимых значений Объём занимаемой памяти
Целочисленные byte от -128 до 127 1 байт
short от -32768 до 32767 2 байта
int от -2147483648 до 2147483647 4 байта
long от -9223372036854775808 до 9223372036854775807 8 байт
С плавающей запятой float от -3.4E+38 до 3.4E+38 4 байта
double от -1.7E+308 до 1.7E+308 8 байт
Символы char от 0 до 65536 2 байт
Логические boolean true или false Для хранения значения этого типа достаточно 1 бита, но в реальности память такими порциями не выделяется, поэтому переменные этого типа могут быть по-разному упакованы виртуальной машиной.

Кроме элементарных типов переменных имеется ещё составной встроенный тип String для хранения строковых значений.

Объявление переменной:

тип_данных имя_переменной;

Имя переменной:

  • начинается с латинской буквы, знака $ или _,
  • не может начинаться с цифры.
  • содержит только латинские буквы.

Присваивание и константы

Примеры присваивания констант разных типов:

byte number1 = 15;
short number2 = 100;
long number3 = 100000000;
String title = "Обожаю Java";
char letter = 'M';
double sum = 145.34567;
float pi = 3.14f;
boolean result = true;

Строковые константы указываются в двойных кавычках.

Символьные константы указываются в одинарных кавычках.

Для переменных типа float к значениям обязательно добавляется буква f.

Комментарии к коду

Комментарии в Java бывают двух типов. Однострочные начинаются с двух косых черт и завершаются в конце строки:

// Выводит на консоль значение переменной k

Многострочные комментарии начинаются символами /* и заканчиваются символами */:

/*
 Программа, демонстрирующая выведение значения 
 переменной на консоль
*/

Операции с переменными

Операции делятся на три группы:

  • арифметические,
  • логические,
  • побитовые.

Арифметические операции:

  • сложение,
  • вычитание,
  • умножение,
  • деление,
  • деление по модулю.

Таблица операций:

Группа операций Название Полная форма Короткая форма Префиксная форма Постфиксная форма
Арифметические Сложение a = a + b a += b
Вычитание a = a - b a -= b
Умножение a = a * b a *= b
Деление a = a / b a /= b
Деление по модулю a = a % b a %= b
Инкремент ++a a++
Декремент --a a--
Логические Больше a > b
Больше или равно a >= b
Меньше a < b
Меньше или равно a <= b
Равно a == b
Не равно a != b
Не !a
Ленивое логическое И a = a && b a &&= b
Ленивое логическое ИЛИ a = a !! b a !!= b
Логическое И a = a & b a &= b
Логическое ИЛИ a = a ! b a != b
Логическое исключающее ИЛИ a = a ^ b a ^= b
Побитовые Побитовое НЕ a = ~a
Побитовое И a = a & b a &= b
Побитовое ИЛИ a = a ! b a != b
Побитовое исключающее ИЛИ a = a ^ b a ^= b
Побитовый сдвиг влево a = a << b a <<= b
Побитовый сдвиг вправо a = a >> b a >>= b
Беззнаковый побитовый сдвиг вправо a = a >>> b a >>>= b

При использовании префиксной формы оператора инкремента или декремента происходит сначала увеличение на единицу, затем использование нового значения в последующих вычислениях.

При использовании постфиксной формы значение переменной тоже увеличивается на единицу, однако в вычислениях используется старое значение переменной.

Ленивые логические операции не выполняют вычисление второго аргумента, если значения первого достаточно для того, чтобы определить результат. Например, если при ленивом вычислении операции логического И значение первого аргумента ложно, то результат будет заведомо ложный и вычислять второй аргумент не имеет смысла. Аналогично при ленивом вычислении операции логического ИЛИ не имеет смысла вычислять значение второго аргумента, если первый аргумент имеет истинное значение, т.к. результат в любом случае будет истинным. Если вычисление второго аргумента приводит к сторонним эффектам, которые важные для дальнейшего выполнения программы, нужно пользоваться логическими операциями с полным вычислением аргументов. Например, во втором аргументе может иметься операция инкремента или выполняться функция чтения данных из файла, которая должна быть выполнена в любом случае.

Операции |, & и ^ вычисляются как логические, применительно к логическим аргументам, и как битовые, если аргументы являются целыми числами.

Приоритеты операций в порядке понижения:

  • !
  • &
  • ^
  • |
  • &&
  • ||