java - 为库包声明类时出现 IllegalAccessError
问题描述
我目前正在对未记录的代码进行维护,并且在 Spring Boot 中运行类时偶然发现了一个奇怪的错误。代码在执行时会引发 IllegalAccessError,但可以正确编译。
似乎原始团队尝试访问 Kafka Streams 的私有方法的方式是“MacGyver 方式”,但我不确定它的行为,因为 IntelliJ 正确导入代码并按应有方式处理继承(如果我声明类作为本地包,它强调说 AbstractStream 和 KTableImpl 类不存在)。
该项目由 Gradle 管理,它是一个微服务。执行是通过 Spring Boot 进行的,并且在启动时会引发错误。
一种可能的解决方案是使用 Java 的反射库,但这似乎不是解决此错误的正确方法。也许引导设置是错误的?
package org.apache.kafka.streams.kstream.internals;
import org.apache.kafka.streams.kstream.KTable;
public class KTableSpy {
public static <K> String getName(AbstractStream<K> stream) {
return stream.name;
}
public static <K, V> void enableSendingOldValues(KTable<K, V> table) {
((KTableImpl<K, ?, V>) table).enableSendingOldValues();
}
}
此类应该已经正常工作并且不会干扰服务启动。相反,我们有以下错误
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AVCompanyStateProjector': Invocation of init method failed; nested exception is java.lang.IllegalAccessError: tried to access method org.apache.kafka.streams.kstream.internals.KTableImpl.enableSendingOldValues()V from class org.apache.kafka.streams.kstream.internals.KTableSpy
解决方案
不确定您尝试完成什么,但来自包AbstractStream
而不是公共 API 的一部分(如名称所示)。这意味着可以在不通知的情况下添加/删除方法(甚至整个类)。KTableImpl
org.apache.kafka.streams.kstream.internals
也许可见性enableSendingOldValues()
是从public
包私有更改为破坏您的代码。
推荐阅读
- java - 仅在需要时更新 Java 中的字符串变量
- c# - 如何定义一个采用 List
和 List的方法 在 C# 中 - javascript - React Recompose:在 WithStateProps 中创建的方法不可访问
- eclipse - BIRT 报告/将两个数据集中的字段合并到一个动态文本框中
- javascript - 使用 Angular7/firebase 对数组中的数据进行排序
- google-vision - Google Vision Api 文本检测换行符
- android - 执行 Espresso 测试时更改语言环境
- sql-server - MS Access DNSless 连接到 MS SQL Server 用户 ID/通过失败
- r - ggplot 地图上的意外形状
- javascript - React 组件未连接到商店