More Related Content
Similar to Head toward Java 16 (Night Seminar Edition) (20)
More from Yuji Kubota (19)
Head toward Java 16 (Night Seminar Edition)
- 15. 380:Unix-DomainSocketChannels(3/4)
import java.net.UnixDomainSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import static java.net.StandardProtocolFamily.UNIX;
public class Server {
private static final Path SOCKETE_FILEPATH = Path.of("./", "testsocket");
public static void main(String... args) throws Exception {
var address = UnixDomainSocketAddress.of(SOCKETE_FILEPATH);
try (var serverChannel = ServerSocketChannel.open(UNIX)) { // INETかUNIXかを指定
serverChannel.bind(address);
try (var clientChannel = serverChannel.accept()) {
ByteBuffer buf = ByteBuffer.allocate(64);
clientChannel.read(buf);
buf.flip();
System.out.printf("Read %d bytesn", buf.remaining());
}
} finally {
Files.deleteIfExists(address.getPath()); // ソケットと独⽴してファイルが存在するので確実に消す
}
}
}
- 16. 380:Unix-DomainSocketChannels(4/4)
import java.net.UnixDomainSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.nio.file.Path;
public class Client {
private static final Path SOCKETE_FILEPATH = Path.of("./", "testsocket");
public static void main(String... args) throws Exception {
var address = UnixDomainSocketAddress.of(SOCKETE_FILEPATH);
try (var clientChannel = SocketChannel.open(address)) {
ByteBuffer buf = ByteBuffer.wrap((args.length != 0 ? args[0] : "Hello world").getBytes());
clientChannel.write(buf);
}
}
}
ref:https://inside.java/2021/02/03/jep380-unix-domain-sockets-channels/
- 18. 389:ForeignLinkerAPI(Incubator)(2/2)
import java.lang.invoke.*;
import jdk.incubator.foreign.*;
class PanamaMain {
public static void main(String[] args) throws Throwable {
// System Linker取得、ネイティブシンボルのルックアップ
var linker = CLinker.getInstance();
var lookup = LibraryLookup.ofDefault();
// C宣⾔のメソッドハンドル作成、関数記述⼦算出
var getpid = linker.downcallHandle(
lookup.lookup("getpid").get(),
MethodType.methodType(int.class),
FunctionDescriptor.of(CLinker.C_INT));
// 実⾏
System.out.println((int)getpid.invokeExact());
}
}
$ java -Dforeign.restricted=permit --add-modules jdk.incubator.foreign PanamaMain.java
ref.https://inside.java/2020/10/06/jextract/
より楽に:Cheaderファイルから上記相当の処理を⾏うJavaクラスをjextractで作成できる(サンプル集)
- 21. 390:WarningsforValue-BasedClasses(3/4)
$ ./jdk-16.jdk/bin/javac ValueBased.java
ValueBased.java:5: 警告:[synchronization] 値ベース・クラスのインスタンスで同期しようとしました
synchronized (valueBased)) {
^
警告1個
$ ./jdk-16.jdk/bin/java -XX:+UnlockDiagnosticVMOptions -XX:DiagnoseSyncOnValueBasedClasses=1 ValueBased
#
# A fatal error has been detected by the Java Runtime Environment:
#
# Internal Error (synchronizer.cpp:416), pid=71724, tid=11267
# fatal error: Synchronizing on object 0x00000007bfe78198 of klass java.lang.Long at ValueBased.main(ValueBased.java:5)
:(snip)
$ ./jdk-16.jdk/bin/java -XX:+UnlockDiagnosticVMOptions -XX:DiagnoseSyncOnValueBasedClasses=2 ValueBased
[0.101s][info][valuebasedclasses] Synchronizing on object 0x00000007bfe78198 of klass java.lang.Long
[0.101s][info][valuebasedclasses] at ValueBased.main(ValueBased.java:5)
[0.101s][info][valuebasedclasses] - locked <0x00000007bfe78198> (a java.lang.Long)
:(snip)
- 22. 390:WarningsforValue-BasedClasses(4/4)
実現するために、対象クラスに @jdk.internal.ValueBased アノテーション追加
java.lang.{Integer,Long,Short,...} (primitivewrapperclass)
java.lang.Runtime.Version
java.util.{Optional,OptionalInt,OptionalLong,OptionalDouble}
java.time.{Instant,LocalDate,LocalTime,...} ,
java.time.chrono.MinguoDate,HijrahDate,...
java.lang.ProcessHandle (+実装クラス)
java.util のcollectionファクトリー実装クラス
java.util.List.{of,copyOf}
java.util.Map.{of,copyOf,ofEntries,entry}
- 31. Basicusage
$ jpackage --name sample --input <directory_includes_jar>
--main-jar sample.jar --main-class Sample
$ ls sample-*
sample-1.0.dmg
Withcustomruntimeimage:
# Show ependent modules
$ jdeps -summary Sample.class
Sample.class -> java.base
Sample.class -> java.desktop
# Create runtime image that consists only of dependent modules
$ jlink --add-modules java.base,java.desktop --output image
# Create installer with custom runtime image
$ jpackage --name sample --input <directory_includes_jar>
--main-jar sample.jar --main-class Sample --runtime-image image