zoukankan      html  css  js  c++  java
  • Java12新特性 -- JVM 常量 API

    Java 12 中引入 JVM 常量 API,用来更容易地对关键类文件 (key class-file) 和运行时构件(artefact)的名义描述
    (nominal description) 进行建模,特别是对那些从常量池加载的常量,这是一项非常技术性的变化,能够以更简
    单、标准的方式处理可加载常量。
    具体来说就是java.base模块新增了java.lang.constant包(而非 java.lang.invoke.constant )。包中定义了一系列基于值的符号引用(JVMS 5.1)类型,它们能够描述每种可加载常量。

    官方api链接地址:
    
    http://cr.openjdk.java.net/~iris/se/12/latestSpec/api/java.base/java/lang/constant/pack
    age-summary.html
    
    Java SE > Java SE Specifications > Java Virtual Machine Specification下的第5章:
    Chapter 5. Loading, Linking, and Initializing
    
    https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html
    

    引入了ConstantDesc接口( ClassDesc、MethodTypeDesc、MethodHandleDesc这几个接口直接继承了ConstantDesc接口)以及Constable接口;ConstantDesc接口定义了resolveConstantDesc方法,Constable接口定义了describeConstable方法;String、Integer、Long、Float、Double均实现了这两个接口,而EnumDesc实现了ConstantDesc接口。

    KKdW7Q.png

    符号引用以纯 nominal 形式描述可加载常量,与类加载或可访问性上下文区分开。有些类可以作为自己的符号引用(例如 String)。而对于可链接常量,另外定义了一系列符号引用类型,具体包括: ClassDesc (Class 的可加载常量标称描述符) ,MethodTypeDesc(方法类型常量标称描述符) ,MethodHandleDesc (方法句柄常量标称描述符) 和DynamicConstantDesc (动态常量标称描述符) ,它们包含描述这些常量的 nominal 信息。此 API 对于操作类和方法的工具很有帮助。

    String 实现了 Constable 接口:
    public final class String implements java.io.Serializable, Comparable<String>,
    CharSequence,Constable, ConstantDesc {
    

    java.lang.constant.Constable接口定义了抽象方法:

    public interface Constable {
    Optional<? extends ConstantDesc> describeConstable();
    }
    

    Java 12 String 的实现源码:

    @Override
    public Optional<String> describeConstable() {
    return Optional.of(this);
    }
    

    很简单,其实就是调用 Optional.of 方法返回一个 Optional 类型。

    String#describeConstable和resolveConstantDesc

    新引入的接口java.lang.constant.Constable - 它用于标记constable类型,这意味着这类型的值是常量,可以在JVMS 4.4常量池中定义。

    Java SE > Java SE Specifications > Java Virtual Machine Specification下的第4章:
    Chapter 4. The class File Format

    String的源码:

    /**
    * Returns an {@link Optional} containing the nominal descriptor for this
    * instance, which is the instance itself.
    *
    * @return an {@link Optional} describing the {@linkplain String} instance
    * @since 12
    */
    @Override
    public Optional<String> describeConstable() {
    	return Optional.of(this);
    }
    /**
    * Resolves this instance as a {@link ConstantDesc}, the result of which is
    * the instance itself.
    *
    * @param lookup ignored
    * @return the {@linkplain String} instance
    * @since 12
    */
    @Override
    public String resolveConstantDesc(MethodHandles.Lookup lookup) {
    	return this;
    }
    
    private static void testDescribeConstable() {
        System.out.println("======test java 12 describeConstable======");
        String name = "Java高级工程师";
        Optional<String> optional = name.describeConstable();
        System.out.println(optional.get());
    }
    
  • 相关阅读:
    Hibernate 事务和并发控制
    InfoSYS-20170114
    STM32学习笔记:读写内部Flash(介绍+附代码)
    STM32串口通信配置(USART1+USART2+USART3+UART4)
    Keil-MDK编译完成后代码大小
    STM32窗口看门狗和独立看门狗的区别,看门狗介绍及代码演示
    关于单片机编程里面调用sprintf死机的解决方法及原因分析
    ESP8266 wifi 模块配置,Wechat+APP控制实现
    STM32常见问题
    深入浅出 TCP/IP 协议
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/11707895.html
Copyright © 2011-2022 走看看