-
Notifications
You must be signed in to change notification settings - Fork 13
Open
Description
简单复现一下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 核心类,导致访问非法。
复现步骤
- 在 Java 9 及以上版本运行使用 Kotime 的项目;
- 触发含
String类型参数的方法调用监控; - 出现上述异常。
建议修复方案
- 在
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
Labels
No labels