JDK16新特性

这里只介绍一些跟开发关联度较大的特性,除此之外JDK16还更新了许多其他新特性,感兴趣的同学可以去Oracle官网查看

包装类构造方法的警告

使用包装类的构造方法在编译的时候会出现警告,不建议再使用包装类的构造方法。下面代码在javac编译之后会出现警告。

Integer i = new Integer(8);

不建议使用包装类作为锁对象,倘若使用包装类作为锁对象,在编译时会出现警告。

	Integer i = 8;
	synchronized(i){

	}

新增日时段

在DateTimeFormatter.ofPattern传入B可以获取现在时间对应的日时段,上午,下午等

System.out.println(DateTimeFormatter.ofPattern("B").format(LocalDateTime.now()));

InvocationHandler新增方法

在该接口中添加了下面方法

public static Object invokeDefault(Object proxy, Method method, Object... args)

该方法可以调用父接口中defalut方法,比如有下面接口

interface Girl{
	default void eat(){
		System.out.println("cucumber");
	}

}

实现类

public class Lucy implements Girl{
	public void eat(){
		System.out.println("banana");
	}
}

测试类:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Test{
	public static void main(String[] args) {
		Girl girl = new Lucy();


		//不使用invokeDefault会调用重写的eat方法
		Girl proxy1 = (Girl)Proxy.newProxyInstance(girl.getClass().getClassLoader(),girl.getClass().getInterfaces(),
			(obj,method,params)->{
			Object invoke = method.invoke(girl);
			return invoke;
		});
		proxy1.eat();
	
		//使用invokeDefault会调用父接口中的default方法
		Girl proxy2 = (Girl)Proxy.newProxyInstance(Girl.class.getClassLoader(),new Class<?>[]{Girl.class},
			(obj,method,params)->{
			if (method.isDefault()) {
				return InvocationHandler.invokeDefault(obj, method, params);
			}
			return null;
		});
		proxy2.eat();
	
	}

}

其他

在之前jdk版本中作为预览功能的Record类,模式匹配的instanceof,打包工具jpackage,已成为正式版。jdk16对GC,jvm运行时内存等内容有一些变化,例如:ZGC并发栈处理弹性meta space