Java如何创建可通过点运算符调用的自定义扩展方法
结论
Java本身不支持原生的扩展方法特性,但有两种常用方案可以实现类似效果,其中第二种方案可以满足你要的「通过点运算符直接调用」的需求。
方案1:静态工具类(无额外依赖、生态通用)
这是Java生态最普及的实现方式,兼容性最高,不需要依赖任何第三方组件:
- 首先实现自定义工具类,所有方法设为静态,第一个参数为你要扩展的目标类型
package com.yourlib.utils; public class ObjectUtils { // 私有构造避免工具类被实例化 private ObjectUtils() {} public static String toStringAndTrim(Object obj) { if (obj == null) { return ""; } return obj.toString().trim(); } public static String toStringAndReplace(Object obj, CharSequence target, CharSequence replacement) { if (obj == null) { return ""; } if (target == null || replacement == null) { return obj.toString(); } return obj.toString().replace(target, replacement); } }
- 使用时静态导入对应方法即可直接调用:
import static com.yourlib.utils.ObjectUtils.*; public class Test { public static void main(String[] args) { Object testVal = " test content "; String trimmedStr = toStringAndTrim(testVal); } }
- 缺陷:无法使用
testVal.toStringAndTrim()的点调用写法,只能以静态方法的形式传入参数调用。
方案2:基于Lombok实验特性实现点调用
如果需要完全符合你说的「导入类库后直接用点运算符调用」的效果,可以借助Lombok的@ExtensionMethod编译期语法糖实现:
- 你的类库侧依然按照方案1实现静态工具类
ObjectUtils即可 - 接入方需要先引入Lombok依赖并开启注解处理,在需要使用扩展方法的类上添加
@ExtensionMethod注解:
import lombok.experimental.ExtensionMethod; import com.yourlib.utils.ObjectUtils; // 声明要加载的扩展工具类 @ExtensionMethod(ObjectUtils.class) public class Test { public static void main(String[] args) { Object testVal = " test content "; // 直接通过点运算符调用,编译后会自动转换为ObjectUtils.toStringAndTrim(testVal) String trimmedStr = testVal.toStringAndTrim(); } }
- 注意事项:
- 该功能属于Lombok的实验性功能,不是Java官方原生语法,强制要求接入方安装Lombok并开启注解处理才可以使用
- 不建议公共类库强制要求接入方使用该特性,会大幅提高接入成本和编译冲突概率
内容的提问来源于stack exchange,提问作者gurkan
相关产品推荐
相关产品推荐

