Java 16
JPackage, Foreign Linker API gibi öne çıkan özelliklerin eklendiği Java 16 sürümü ile ilgili bilgiler ve kullanımı yer alıyor.
Vector API (Incubator) – JEP 338
Java JIT derleyicisine otomatik vektör özelliği geliştirmesidir. Bu özellik sayesinde Java içerisindeki skalar veya tek işlemin otomatik olarak vektöre dönüştürülmesi ve vektörel işlemlerde elde edilen(SIMD ile) performansın elde edilmesi amaçlanmaktadır. Özellik Java derleyicisinde(JIT) yapılmıştır.
Enable C++14 Language Features – JEP 347
JDK kodlarına C++14 dili desteği eklendi. Özellik sayesinde JDK C++14 ile birlikte gelen özelliklerin kullanımı sağlanmış oldu.
C++ 14 ile gelen özelliklere C++ 14 üzerinden ulaşabilirsiniz.
Migrate from Mercurial to Git – JEP 357
Java derleyici kaynak kodları Mercurial sürüm kontrol sisteminin fazla kaynak kullanımı(dosya boyutu), Mercurial araçlarının yetersiz olması gibi nedenlerden dolayı Git sürüm sistemine geçiş yapılmıştır.
Migrate to GitHub – JEP 369
JEP 357 ile Git sürüm sistemine geçiş ile birlikte Git tabanlı Github kullanımına geçiş yapılmıştır.
ZGC: Concurrent Thread-Stack Processing – JEP 376
ZGC çöp toplayıcısında değişiklik yapılarak ZGC çöp toplayıcısının büyük boyutlu verilerle iyi ve kısa sürede çalışmasını sağlar.
Unix-Domain Socket Channels – JEP 380
İşlemler arasında haberleşme için TCP/IP yerine Unix temelli haberleşme yöntemine(AF_UNIX) geçilmiştir. Özellik Unix temelli MacOS, Linux temelli işletim sistemleri ile birlikte Windows 10 tarafından da desteklenmeye başlanmasıyla kullanılabilir hale gelmiştir.
Alpine Linux Port – JEP 386
Bulut tabanlı işletim sistemlerinde sıklıkla kullanılan Alpine işletim sistemi desteği eklenmiştir. Böylece bir çok Java kütüphanesinin Alpine ile birlikte çalışmasını sağlar.
Elastic Metaspace – JEP 387
Java uygulamalarına ait kullanılmayan verilerin(metadata) hızlı bir şekilde işletim sistemine iade edilmesini sağlanmıştır.
Windows/AArch64 Port – JEP 388
AArch64 veya ARM64 işlemci desteği eklenmiştir.
Foreign Linker API (Incubator) – JEP 389
C veya C++ kodlarına doğrudan erişim imkanı getirilmiştir. Bu sayede karmaşık JNI işlemleri daha basit hale gelmiştir.
MethodHandle strlen = CLinker.getInstance().downcallHandle(
LibraryLookup.ofDefault().lookup("strlen").get(),
MethodType.methodType(long.class, MemoryAddress.class),
FunctionDescriptor.of(CLinker.C_LONG_LONG, CLinker.C_POINTER)
);
Yukarıdaki kod parçası C dilinde yer alan strlen metoduna erişmektedir.
LibraryLookup ile erişilecek metot belirlenmiştir.
MethodType ile metodun Java’ya döndürülme biçimi belirtilmiştir.
FunctionDescriptor ile ise C dilindeki karşılığı belirtilmiştir.
NOT: İşletim sistemine göre C dili tanımı(FunctionDescriptor kullanımı) farklılık gösterebilir.
Aşağıda örnek kullanım yer almaktadır.
MethodHandle strlen = CLinker.getInstance().downcallHandle(
LibraryLookup.ofDefault().lookup("strlen").get(),
MethodType.methodType(long.class, MemoryAddress.class),
FunctionDescriptor.of(CLinker.C_LONG_LONG, CLinker.C_POINTER)
);
String str = "Yusuf Sezer";
MemorySegment memorySegment = CLinker.toCString(str); // Java String adres bilgisi alınıyor
long result = (long) strlen.invokeExact(memorySegment.address()); // strlen metodu String adres bilgisi ile çalıştırılıyor
System.out.println(result);
memorySegment.close();
CLinker#toCString metodu yardımıyla str değişkeninin adres bilgisi alınarak MethodHandle#invokeExact metoduna parametre olarak gönderilmektedir.
MethodHandle#invokeExact adres bilgisini parametre olarak alarak C komutlarını çalıştırır.
Sonuç istenilen türe çevrilerek kullanılır.
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType;
import jdk.incubator.foreign.CLinker;
import jdk.incubator.foreign.FunctionDescriptor;
import jdk.incubator.foreign.LibraryLookup;
import jdk.incubator.foreign.MemoryAddress;
import jdk.incubator.foreign.MemorySegment;
public class App {
public static void main(String[] args) throws Throwable {
MethodHandle strlen = CLinker.getInstance().downcallHandle(
LibraryLookup.ofDefault().lookup("strlen").get(),
MethodType.methodType(long.class, MemoryAddress.class),
FunctionDescriptor.of(CLinker.C_LONG_LONG, CLinker.C_POINTER)
);
String str = "Yusuf Sezer";
MemorySegment memorySegment = CLinker.toCString(str);
long result = (long) strlen.invokeExact(memorySegment.address());
System.out.println("Uzunluk: " + result);
memorySegment.close();
}
}
Özelliğin kullanımı için jdk.incubator.foreign modülünün proje eklenmesi gerekmektedir.
Modül eklenerek komutlar derlenir.
javac --add-modules jdk.incubator.foreign App.java
Derlendikten sonra çalıştırılır.
java --add-modules jdk.incubator.foreign -Dforeign.restricted=permit App
NOT: Özellik geliştirme aşamasındadır.
Warnings for Value-Based Classes – JEP 390
Değer taşıyan veya @jdk.internal.ValueBased ifadesi ile belirtilen sınıfların senkronizasyonu sırasında uyarı verecektir.
Aşağıdaki komut derlenme aşamasında uyarı verecektir.
Double d = 20.0;
synchronized (d) {}
Java 9 ile birlikte değer taşıyan, sarmalayıcı(wrapper) sınıfların kullanımdan kaldırılan kurucu metotları @Deprecated(since=”9″, forRemoval = true) olarak işaretlenmiştir.
Packaging Tool – JEP 392
Java 14 sürümüyle birlikte gelen paketleme özelliğinin devamıdır.
Özellik sayesinde ek kütüphaneye ihtiyaç duymadan işletim sistemine göre(deb, rpm, pkg, dmg, msi, exe) kurulum paketi oluşturmayı sağlar.
Swing örneğinde yer alan aşağıdaki kodları kullanarak derleme paketleme işlemini yapalım.
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class App {
public static void main(String[] args) {
JFrame pencere = new JFrame();
pencere.setTitle("Java Swing");
pencere.setSize(300, 200);
JLabel label = new JLabel("www.yusufsezer.com");
label.setBounds(50, 50, 150, 20);
pencere.add(label);
JButton button = new JButton("Tıkla");
button.setBounds(50, 70, 60, 20);
pencere.add(button);
pencere.setLayout(null);
pencere.setLocationRelativeTo(null);
pencere.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pencere.setVisible(true);
}
}
Komutları derleyelim.
javac App.java
Derlenen komutları paketleyelim.
jar cvf app.jar App.class
Paketleme aracını kullanarak işletim sistemine göre kurulum paketi haline getirelim.
jpackage --input . --name App --main-jar app.jar --main-class App
Kurulum dosyası kullanılarak işletim sistemine göre kurulum yapılır.
Kurulum dosyası ayarları ile ilgili detaylı bilgi için araç kullanımına bakmak faydalı olacaktır.
jpackage --help
Foreign-Memory Access API (Third Incubator) – JEP 393
Java 14 ve 15 sürümlerinde geliştirilmesi devam eden farklı bellek alanına erişim özelliğinin geliştirilmesinin devamıdır.
Pattern Matching for instanceof – JEP 394
Java 14 ve 15 sürümlerinde gelen pattern matching özelliği standart hale gelerek Java’ya eklenmiştir.
Records – JEP 395
Java 14 ve 15 sürümlerinde gelen records özelliği standart hale gelerek Java’ya eklenmiştir.
Strongly Encapsulate JDK Internals by Default – JEP 396
Java 9 ile birlikte JDK içerisinde yer alan sınıflara erişim engellenmiş ancak kullanan sınıfların işleyişi bozulmaması için –illegal-access değeri varsayılan olarak permit değeri ile izin verilmiştir.
Java 16 ile birlikte varsayılan olarak deny olarak değiştirilerek JDK sınıflarının doğrudan kullanımı engellenmiştir.
Sealed Classes (Second Preview) – JEP 397
Java 15 sürümü ile birlikte gelen Sealed Classes özelliğinin devamıdır.
Diğer
Önceki Java sürümlerinde olduğu gibi bulut tabanlı uygulamalardaki performansı arttırmak için bir çok geliştirme yapılmıştır.
Karmaşık JNI kullanımını azaltan Foreign Linker API ve paketleme işlemini kolaylaştıran Packaging Tool öne çıkan özellikler olmuştur.
Java Derslerine buradan ulaşabilirsiniz.
Hayırlı günler dilerim.