浅析Java中的InvokeDynamic

Java语言在被编译成class文件后,在class文件中,有专门的一个“常量池”(Constant Pool)区域来存储一些运行所需要的常量,包括一些写死的变量(比如定义一个字符串String str = "Hello world"以及一些符号,例如类和方法的的名称等)。在JVM(se7)规范中,有以下这些类型的常量:

CONSTANT_Class                           CONSTANT_Long            
CONSTANT_Fieldref                        CONSTANT_Double          
CONSTANT_Methodref                       CONSTANT_NameAndType     
CONSTANT_InterfaceMethodref              CONSTANT_Utf8            
CONSTANT_String                          CONSTANT_MethodHandle    
CONSTANT_Integer                         CONSTANT_MethodType      
CONSTANT_Float                           CONSTANT_InvokeDynamic       

大部分我们顾名思义,都可以知道是大概是干啥的,比如字符串啊,数字啊,方法名称之类的;但是可以注意到最后面一个是称之为CONSTANT_InvokeDynamic的常量,这个就有点陌生了。那么,这是一个什么样的常量?什么情况下会出现这个呢?

[阅读更多...]
使用Vagrant来管理Virtualbox

一直以来我用Virtualbox都是手动创建虚拟机,然后安装操作系统,虽然这个过程本身并不复杂但是也要重复操作和花费时间。通过Vagrant可以像使用Docker一样,编写脚本来管理虚拟机的配置,还可以通过公共的镜像仓库来获取一些别人已经构建好了的镜像。

[阅读更多...]
Flutter性能优化实践

我的加密软件有一个登录页面,需要用户输入主密码然后验证密码之后才能进入。因为密码转换(Key transform)过程中用到了Argon2算法,而这个算法没有原生的dart实现,所以必须要通过插件的形式来完成,为此我还专门做了一个插件encryptions。调用插件得到秘钥这个过程大概要花个1~4秒钟,最近在安卓真机上测试发现,这个过程中我的进度条竟然出现了卡顿,也就是说本来应该转圈圈的,结果一开始就卡住不动了,那我还需要这个加载动画干嘛呢?为此研究了一番,如何来解决这个问题。 [阅读更多...]

Rust(2) Ownership

传统的C语言需要开发人员手动管理内存,而像Java、Go这样的语言是通过垃圾回收机制自动进行内存管理。但通常垃圾回收机制本身较为复杂且需要不定期的进行(也就是说实际当内存不在需要的时候并不一定能得到及时的释放)。而rust语言采取的所有权机制(Ownership)是它区别于其他语言的一个重要特征,它被用来进行高效安全的内存管理。

[阅读更多...]
Java中的时间

你如果以为,Java中谈到时间仅仅就意味着java.util.Date那就大错特错了,Java中的时间其实可以说五花八门,Java8发布后又增加了一些新的用来表示日期和时间的类,那么我们在构建应用程序的时候到底应该用哪个类来呢?彼此之间又有什么区别?

[阅读更多...]