Java9+替换isAccessible为canAccess后Maven测试编译报错求助
问题描述
处理SonarCloud项目Bug时,因Java9+弃用isAccessible()方法,按照文档替换为canAccess(Object)后,执行mvn test仍出现编译错误。
原代码:
static <T> T getFieldValue(Object object, Field field) { boolean accessible = field.isAccessible(); Object value = null; try { if (!accessible) { field.setAccessible(true); } value = field.get(object); } catch (IllegalAccessException ignored) { } finally { field.setAccessible(accessible); } return (T) value; }
替换后的代码:
static <T> T getFieldValue(Object object, Field field) { boolean accessible = field.canAccess(object); Object value = null; try { if (!accessible) { field.setAccessible(true); } value = field.get(object); } catch (IllegalAccessException ignored) { } finally { field.setAccessible(accessible); } return (T) value; }
编译错误提示:找不到符号方法canAccess(Object)
解决方案
1. 强制Maven编译目标为Java9+
canAccess(Object)是Java9新增方法,若Maven编译级别低于Java9,编译器会直接报错找不到该方法。在pom.xml中配置maven-compiler-plugin:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>11</source> <!-- 替换为你实际使用的Java版本,至少9 --> <target>11</target> <release>11</release> <!-- 可选,统一源和目标版本 --> </configuration> </plugin> </plugins> </build>
执行mvn clean compile重新编译,确认基础编译错误是否消除。
2. 处理JPMS模块访问限制(若用模块系统)
如果项目使用Java模块系统(存在module-info.java),即使调用setAccessible(true),也可能因模块封装规则无法访问字段。需在模块描述中添加opens声明,允许反射访问目标包:
module your.module.name { // 仅允许测试模块访问(推荐) opens com.your.target.package to org.junit.jupiter, your.test.module; // 或允许所有模块访问(不推荐生产环境) opens com.your.target.package; }
3. 适配静态字段场景(可选)
若代码中存在访问静态字段的情况,object参数会为null,此时canAccess(null)是合法的,但可以显式区分逻辑让代码更清晰:
boolean accessible = Modifier.isStatic(field.getModifiers()) ? field.canAccess(null) : field.canAccess(object);
4. 更新过时Maven插件
部分旧版插件(如maven-surefire-plugin)可能不兼容Java9+,需更新到适配版本:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> </plugin>
内容的提问来源于stack exchange,提问作者letterspacing
相关产品推荐
相关产品推荐

