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 |
При использовании префиксной формы оператора инкремента или декремента происходит сначала увеличение на единицу, затем использование нового значения в последующих вычислениях.
При использовании постфиксной формы значение переменной тоже увеличивается на единицу, однако в вычислениях используется старое значение переменной.
Ленивые логические операции не выполняют вычисление второго аргумента, если значения первого достаточно для того, чтобы определить результат. Например, если при ленивом вычислении операции логического И значение первого аргумента ложно, то результат будет заведомо ложный и вычислять второй аргумент не имеет смысла. Аналогично при ленивом вычислении операции логического ИЛИ не имеет смысла вычислять значение второго аргумента, если первый аргумент имеет истинное значение, т.к. результат в любом случае будет истинным. Если вычисление второго аргумента приводит к сторонним эффектам, которые важные для дальнейшего выполнения программы, нужно пользоваться логическими операциями с полным вычислением аргументов. Например, во втором аргументе может иметься операция инкремента или выполняться функция чтения данных из файла, которая должна быть выполнена в любом случае.
Операции |, & и ^ вычисляются как логические, применительно к логическим аргументам, и как битовые, если аргументы являются целыми числами.
Приоритеты операций в порядке понижения:
- !
- &
- ^
- |
- &&
- ||