JVM的扩展之道
简单来说,扩展机制是一种用来增加或修改系统功能的机制,而不需要改动系统的主体结构。在 Java 中,常见的扩展机制有接口、抽象类、反射、SPI 等。
扩展机制的作用是什么呢?其实在软件开发中,我们经常需要为程序增加新的功能或者修改已有的功能。如果没有扩展机制,我们就需要修改原有的代码,这样会增加出错的可能性,而且这样操作也“不符合对修改关闭,对扩展开放”的开闭原则。扩展机制正好可以帮助我们避免这个问题,它允许我们在不改变原有代码的基础上进行功能的扩展。
扩展机制的实现方式是多样的,接口、抽象类都可以用于定义公共的方法,供其他类实现或者继承;反射则可以在运行时动态地创建对象和调用方法;动态代理则可以在运行时动态地创建和控制对象的行为;SPI 则是 Java 提供的一种服务提供发现机制,它允许第三方为一个产品或者一个服务提供插件。
## 接口和抽象类
接口是 Java 里的一种核心机制,它主要负责定义对象的行为协议。这里的协议,你可以理解成规定的一种标准,或者说是一种约束。接口就是规定了一种方法的集合,而这些方法如何实现,就由实现接口的类来决定。接口在 Java 里的特殊之处在于,一个类可以实现多个接口,这就有力地支持了 Java 的动态特性。
再来看看抽象类,它被看作是接口的自然拓展。在一些情况下,不同的实现类里,有些方法可能会有一样的实现方式。如果每个实现类都重复这个实现,那么就有些浪费了。这个时候,抽象类就可以用来封装这些通用的操作。例如刚刚的购物车服务里,无论是哪类用户,只要他们添加商品,购物车里都会增加相应的商品,所以这样的操作就可以被提取到一个抽象类里,由具体的实现类去继承这个抽象类。
## 反射
接下来我们来看反射机制。反射是 Java 的一项强大的特性,它允许我们在运行期动态加载和修改类,不像一般的方法调用需要在编译期确定下来,这给我们提供了极大的灵活性。
## 总结
Java 的扩展机制有很多种,接口和抽象类提供了一种灵活的方式来定义和组织我们的代码,反射 SPI 机制则使我们的代码更具有灵活性和可扩展性,这些机制是构建大型、复杂、强大的 Java 应用程序的基础。
但是你需要注意,这些只是工具和途径,真正的目的是使我们的代码更加容易阅读、修改和扩展。我们应该合理利用这些机制,按需使用,不必强制使用其中某一种机制。特别是反射和 SPI,虽然它们提供了强大的功能,但是同样会增加代码的复杂度,我们需要在灵活性和复杂性之间做出平衡。
此文章为10月Day6学习笔记,内容来源于极客时间《云时代JVM实战 》,强烈推荐该课程