深入理解JAVA虚拟机学习笔记15——字节码执行引擎(动态类型语言与lambda表达式)

每天进步一点点!

在我们刚接触Java时候,我们就被告知,Java是一门静态类型语言。

随着开发技术的发展,出现了更多的动态语言,比如我们耳熟能详的Groovy,List,Python,Ruby,JavaScript等。

这也就迫使Java需要做出改变,从jdk7开始,Java提供了对动态类型语言的支持,引入了invokedymanic指令提供对动态类型语言的支持。

随之在jdk8开始,推出了lambda表达式,来实现动态类型语言特性。

动态类型语言这个词已经活跃了很多年了,听起来比较复杂,其实也挺复杂的。

首先我们看一下什么是动态类型语言?简单地说,静态类型语言在编译期进行类型检查,而动态类型语言在运行期进行类型检查。

动态类型语言的特点,说的再直白一点——“变量无类型而变量值才有类型”。

如下图所示,在Java方法中,定义的变量a,b,c的类型是确定的,就是int型。

下面我们再看一下JavaScript的代码,如果不通过执行的话,我们是无法确定element到底是什么类型的。

知道了两种类型的区别,再简单对比一下两种类型的优缺点:

静态类型语言:提供严谨的类型检查,有利于稳定性和功能扩展,适合大型系统。

动态类型语言:代码编写更加灵活,开发效率提升。

既然提到了lambda表达式,那就让我们简单地一起来学习一下。

lambda表达式的语法格式:(parameters) -> expression或(parameters) ->{ statements; }。

用法和一些需要注意的地方,我们通过下面几个例子感受一下。

1. lambda表达式可以用来代替匿名内部类

如下图所示,我们写了一个test1()方法,用来创建一个线程,线程中包含一个打印操作。

我们便可以使用test2()中一行代码作为代替,你还别说,确实些起来更加简洁了!

注意了,我们可以看到,这里参数列表为空,lambda表达式是可以没有参数的!

还有一个地方,那就是如果主题包含了一个语句就不用写花括号{}了。

前面我们说过,引入了invokedymanic指令提供对动态类型语言的支持,我们不妨打开字节码文件看一眼,嗯,还好书上没有骗我。

相对应地,常量池中的类型也变成了CONSTANT_Methodref_info。

2. lambda表达式可以用来实现接口

首先我们定义一个接口Inter,其中包含一个方法sayHello(),需要传入参数name。

按照常规的做法,我们会写一个实现类InterImpl用来实现Inter接口,并实现sayHello()方法。

然后通过创建对象,传入参数,调用方法。

但是,假如使用lambda表达式怎么写呢?如下图所示,简单的令人发指有木有!!!

好,这里有第三个需要注意的地方了:当参数只有一个的时候,可以不用写括号。

3. lambda表达式实现集合的遍历

这个相信朋友都能看懂就不说什么了,但是有一点前面已经提到过了,大家不要忽视了,参数str是没有指定类型的。

4. 使用lambda表达式实现函数式编程

在Java 8中新增了一个类java.util.function.Predicate是支持函数式编程的。

最后要注意的一点:主体只有一个表达式编译器会自动返回值,不需要写return,但是多条的时候是需要的。

看了这么多lambda表达式的例子,我们再来看一下书中提到了一种新的确定目标方法的类java.lang.invoke.MethodHandle:

我们打开看一眼,一共1457行,这一片一片的都是啥啊?幸亏笔者眼尖,在248行发现了“Usage examples”几个大字,ctrl+c,ctrl+v复制到单元测试类中,就看一下前几行吧。

mt中包含了方法的返回值类型(String)和参数类型数组。

mh中又增加member用来存储对应的目标方法和执行指令:java.lang.String.replace(char,char)String/invokeSpecial

最后在invokeExact中调用了方法的执行,笔者这里也只有抛砖引入,更加深入的使用方法,还有待于朋友们共同探讨。

最后,依据笔者的经验,动态类型语言可以用来写工具类。

however,然鹅,并不建议在业务系统代码中使用,可读性真的有待商榷。

喜欢文章或想一起学习的朋友可以关注我,给我点赞,我将会持续更新,有什么疑问或文中有不当之处请给我留言,真诚地希望能与大家一起交流探讨,学习进步!


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值