00:00
好,接着呢,我们来说下一个新特性啊,叫GM呢常量API啊,这呢属于我们API层面的一个变化了啊,JAVA12呢,引入了叫GM常量API,能够更容易的对k class file和那运行时的这个构件啊进行名义上的一个描述啊,就nominal description。啊,进行这个建模,然后特别呢是那些从常量池加载的常量啊,从常量池加载常量,典型的就是我们说的string啊,这里边呢,很显然对string呢也进行了相关的一些这个处理啊,一会儿我们来说,呃,那具体来说的话呢,我们新增加了一篇呢,是处在java.base模块的,呃,java.long点啊content这样的一个包下啊,常量这个包下,呃,这个呢,网上很多的这个帖子啊,用的都是这个包啊扎va点浪包点in vo.constant啊这个呢是错误的啊,当然我在想说为什么这是错误的啊,原来发现这个官方呢,提供这个文档当中提到的就是点constant,这是有问题的哈,注意是这个包包中呢,定义了一系列关于值的符号引用啊,这个类型他们能够描述每种可加载的常量啊,这里边呢,提到了要GMS,呃,这什么意思呢?呃,是我们每次更新一个新的,呃,JDK版本的时候呢,我们都会对应着一个Java的一个规范的更新。
01:20
诶,Java规范,呃,每发布一个新的JDK啊,相应的Java SE,比如对应的一个规范,像11啊,像12这有对应的规范,那么规范呢,还对应的一个叫GVM的一个规范啊,就是GMSS呢,指的就是这样啊,Specification啊,呃,那么在我们GM这个规范的5.1这个章节当中啊,就是来定义我们关于类的加载。这个我们知道呢,生成自解码文件以后,我们接下来需要使用类加载的子系统,将我们一个类呢自解码文件啊,将这个自解码文件呢,加载到我们的这个这个运营时数据区啊,这个涉及到有三个环节啊loading啊loading属于加载环节啊,链接环节和初始化环节啊,大家呢,如果对这块感兴趣呢,可以把这个链接呢CTRLC加到我们这个浏览器当中啊,进行一个查看。
02:10
啊,这呢就是对应我们扎虚尼这个规范当中啊,提到的第五章关于类的一个加载过程啊,这里边呢,我们主要呢,针对的是这个第一个环节啊,关于运行时的一个常量池啊,这个大家呢,如果说读起来有点费劲的话呢,你也可以进行一个翻译。啊是这样的,那么运行量池它其实呢,主要是将我们这个,嗯,在运行的时候,这个在运行的时候呢,我们需要呢,加载最初呢这个常量数据啊,这个最初呢,使用的都是符号性的,那运行矢量之中的这个符号引用就是从这个类或接口的二进制数据当中啊排生出来的这个二进制数据呢,就是我们加载这个环节啊数据呢,都是以二进制流的方式呢,加载到内存当中的。啊,这样的情况。好,那么刚才呢,提到了说嗯,对应的这个包啊,那我们来找一下,在我们这个工程下啊,有引入的我们这个API,诶12里边我们是Java点贝斯这个模块下的,Java点儿浪包下的,哎,Constant。
03:15
看常量,那这呢,就是我们定义的新的一些常量API啊,那这里边呢,我们首先有两个主要关键的接口,一个呢叫accountable啊,就是可常量的一个呢叫constant distance啊,就是呃这个describe,应该说啊,就关于我们这个常量的一些具体的描述了,好那么这个constant d啊,我们看中选中它以后呢,点F4。它的具体的一些实现和子接口呢,包括这样一些啊,比如说这个关于类的描述,关于类类型的描述和类呃方呃方法类型的描述和方法句柄的描述。呃,这呢是主要的三个这个子接口啊嗯,那另外的话,我们能看到主要的这个视线类哈,像string呢,还有我们其他的这个。
04:00
包装类啊,都是作为的主要实现类,呃,这是关于constant describe,然后constable呢啊,就是可常量的啊,它呢选中F4,具体的实现类呢,就是我们提到的一个是string啊,另外呢,是关于我们的这个包装类,还有枚举类。啊,这样的一个情况,那么我们让咱们的包装类这个string啊实现呢,我们刚才提到这两个接口的好处是什么呢?就是它能够以更简单标准的方式呢,去加载我们这些常量啊,所以这块呢,主要涉及到内容呢,就是对于大家来讲啊,其实呢,呃,一开始关注的比较少啊,我们平时呢,就Java c编译啊,Java去运行这块,主要涉及到就是关于我们这个类的加载和自节码的执行啊这样的一些这个情况了啊属于这块啊,那我们主要呢,还是看这个代码上的具具体的一些体现了,比如说呢,在这个constable里边定义了一个叫describe constable。啊,描述一下这个可常量啊化的这样的一个方法,那由于我们这个string呢,实现了这个接口啊,我们可以看一下啊ctrl shift t啊输入一下这个string好进来。
05:08
那进来以后啊,这块我们先找到这个spring的声明。嗯,这是关于这个string的声明,那声明上我们就能看到它实现了一个叫consable和constant的,呃,Describe了,呃,那很自然而然的,我们string呢,就要实现它这个接口当中的方法了,呃,Control o一下啊,第一次诶,CRA constable,呃,这个方法里边呢,其实实现的比较简单啊,就是optional.of把我们当前这个对象呢,做了一个封装啊这样的一个处理,那么其他的关于这个包装类呢,这个情况呢,也是类似的啊,Ctrl shift t,哎,我们比如说来看一下这个。啊in,然后ctrl o一下啊第C啊cable哎,我们看到也是做同样的一个处理操作,那这样处理完以后呢,对于我们后续去使用这些所谓的常量的这个工具呢,就会更加的便捷啊属于这样的一个情况。
06:06
好,那下边呢,也有对应的一个代码的一个情况,其实这个就非常简单了,我们CTRLC看一眼。啊,那么这块回过来。啊,新写一个测试。那关于我们这个的一个。啊的一个测试啊,这个方法呢,我们直接就拿过来了。啊,这这是一个私有方法啊,CTRLV啊,我们把它改成是一个public,哎,上面呢,我加一个呃这个呃单元测试方法不行了啊,这个我还讲成私有吧,因为这是一个static了,那我们可以写一个main方法,那在这里边来测试我们这个方法的执行。哎,这个我们跑一下就行啊。行,哎,这块输出的就是我们这里边的一个字符串了,哎,就相当于是我们在进行一个呃,类的加载的时候,哎,我们定义了一些常量的描述,那么把我们的包装类和string。
07:02
那这个我往上看啊。等等,呃,都让他实现对应的这些接口,那当我们再去加载这些类的时候呢,诶就会更加的便捷简便啊,属于这样的一个好处,那我们现在使用的这些包装类的这个对象呢,我们也可以理解成它是从常量池当中进行的一个加载啊,这个速度呢,也会更加的快捷一些啊,节省内存,OK,这我们就提到了GVM的常量API。
我来说两句