使用反射获取Apache POI中XSSFSheet缩放级别时遇参数错误问题
问题:反射调用XSSFSheet的getDefaultSheetView方法抛出参数数量异常
我想要获取目标XSSFSheet的当前缩放级别,查阅Apache POI官方文档后发现没有对应的getter方法。于是尝试通过反射调用与设置缩放级别逻辑相似的getDefaultSheetView方法,但运行时抛出了java.lang.IllegalArgumentException: wrong number of arguments异常。
我的代码如下:
private static long getZoomLevel(XSSFSheet sheet) throws Exception { Method m = XSSFSheet.class.getDeclaredMethod("getDefaultSheetView", boolean.class); m.setAccessible(true); CTSheetView sheetView = (CTSheetView)m.invoke(sheet); return sheetView.getZoomScale(); }
XSSFSheet类中该方法的定义如下:
private CTSheetView getDefaultSheetView(final boolean create) { .... }
原因及解决方案
异常的直接原因是反射调用方法时未传入方法所需的参数。
从getDefaultSheetView的方法定义可知,它需要接收一个boolean类型的参数create,但你调用m.invoke(sheet)时仅传入了目标对象sheet,缺少了这个必填的boolean参数,因此触发了参数数量不匹配的异常。
修复后的代码如下(传入false表示仅获取现有视图,无需创建新的):
private static long getZoomLevel(XSSFSheet sheet) throws Exception { Method m = XSSFSheet.class.getDeclaredMethod("getDefaultSheetView", boolean.class); m.setAccessible(true); // 补充boolean参数,这里传入false CTSheetView sheetView = (CTSheetView) m.invoke(sheet, false); return sheetView.getZoomScale(); }
内容的提问来源于stack exchange,提问作者Flash
相关产品推荐
相关产品推荐

