Skip to content

Bug反馈 与satoken结合使用遇到的bug | Kotime 库触发 InaccessibleObjectException 的详细问题分析及修复建议 #7

@xiaou61

Description

@xiaou61

简单复现一下bug
代码如下

    /**
     * 教师创建班级
     */
    @GetMapping("/test")
    @SaCheckRole("teacher")
    public void test() {
        boolean teacher = StpUtil.hasRole("teacher");
        log.info("权限校验测试");
        log.info("当前用户是否是教师:{}", teacher);
        return;
    }

报错信息为:

java.lang.reflect.InaccessibleObjectException: Unable to make field private int java.lang.String.hash accessible: module java.base does not "opens java.lang" to unnamed module @62e7f11d
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
	at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
	at java.base/java.lang.reflect.Field.setAccessible(Field.java:172)
	at cn.langpy.kotime.util.Common.getPramsStr(Common.java:171)
	at cn.langpy.kotime.data.RedisBase.addParamAnalyse(RedisBase.java:63)
	at cn.langpy.kotime.service.KoInvokedHandler.onInvoked(KoInvokedHandler.java:28)
	at cn.langpy.kotime.service.InvokedQueue.onInveked(InvokedQueue.java:57)
	at cn.langpy.kotime.config.LoadConfig.lambda$initMethodHandlers$0(LoadConfig.java:195)
	at java.base/java.lang.Thread.run(Thread.java:833)

产生原因

Java 模块系统限制对核心模块的反射访问,Kotime 反射遍历参数字段时没有跳过 JDK 核心类,导致访问非法。

复现步骤

  1. 在 Java 9 及以上版本运行使用 Kotime 的项目;
  2. 触发含 String 类型参数的方法调用监控;
  3. 出现上述异常。

建议修复方案

  • Common.getParamsStr() 等反射方法中,添加判断,跳过 java. 包开头的类字段,避免非法访问。
  • 例如:
for (Field field : param.getClass().getDeclaredFields()) {
    if (field.getDeclaringClass().getName().startsWith("java.")) {
        continue;
    }
    field.setAccessible(true);
    Object value = field.get(param);
    // ...
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions