From 6923b804affd621b6c04c2bf011a4f2223d0c622 Mon Sep 17 00:00:00 2001 From: gongxuanzhang Date: Fri, 28 Apr 2023 18:12:26 +0800 Subject: [PATCH] PoiUtils initRowField add thread security --- .../java/com/alibaba/excel/util/PoiUtils.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/util/PoiUtils.java b/easyexcel-core/src/main/java/com/alibaba/excel/util/PoiUtils.java index 2989b22b..907bd16f 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/util/PoiUtils.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/util/PoiUtils.java @@ -1,6 +1,9 @@ package com.alibaba.excel.util; +import java.lang.reflect.Field; + import com.alibaba.excel.exception.ExcelRuntimeException; + import org.apache.poi.hssf.record.RowRecord; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.ss.usermodel.Row; @@ -8,8 +11,6 @@ import org.apache.poi.util.BitField; import org.apache.poi.util.BitFieldFactory; import org.apache.poi.xssf.usermodel.XSSFRow; -import java.lang.reflect.Field; - /** * utils * @@ -22,7 +23,7 @@ public class PoiUtils { */ public static final BitField CUSTOM_HEIGHT = BitFieldFactory.getInstance(0x640); - private static Field ROW_RECORD_FIELD; + private static volatile Field ROW_RECORD_FIELD; /** * Whether to customize the height @@ -32,16 +33,20 @@ public class PoiUtils { */ public static boolean customHeight(Row row) { if (row instanceof XSSFRow) { - XSSFRow xssfRow = (XSSFRow) row; + XSSFRow xssfRow = (XSSFRow)row; return xssfRow.getCTRow().getCustomHeight(); } if (row instanceof HSSFRow) { - HSSFRow hssfRow = (HSSFRow) row; + HSSFRow hssfRow = (HSSFRow)row; try { if (ROW_RECORD_FIELD == null) { - initRowRecordField(); + synchronized (PoiUtils.class) { + if (ROW_RECORD_FIELD == null) { + initRowRecordField(); + } + } } - RowRecord record = (RowRecord) ROW_RECORD_FIELD.get(hssfRow); + RowRecord record = (RowRecord)ROW_RECORD_FIELD.get(hssfRow); return CUSTOM_HEIGHT.getValue(record.getOptionFlags()) == 1; } catch (IllegalAccessException ignore) { } @@ -49,7 +54,6 @@ public class PoiUtils { return false; } - private static void initRowRecordField() { try { ROW_RECORD_FIELD = HSSFRow.class.getDeclaredField("row");