我目前正在维护未公开代码的维护,并且在Spring Boot中运行类时偶然发现了一个奇怪的错误。该代码在执行时会引发IllegalAccessError,但可以正确编译。
似乎原始团队尝试访问Kafka Streams私有方法的方式是“ MacGyver方法”,但是我不确定它的行为,因为IntelliJ会正确导入代码并按需处理继承(如果我将该类声明为本地包,它着重强调说AbstractStream和KTableImpl类不存在。
该项目由Gradle管理,是一项微服务。通过Spring Boot进行执行,并且在启动时引发错误。
一个可能的解决方案是使用Java的Reflection库,但似乎不是解决此错误的正确方法。也许启动设置是错误的?
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
答案 0 :(得分:0)
不确定要完成什么,但是AbstractStream
和KTableImpl
来自软件包org.apache.kafka.streams.kstream.internals
,而不是公用API的一部分(顾名思义)。这意味着可以在不通知的情况下添加/删除方法(甚至整个类)。
也许enableSendingOldValues()
的可见性是从public
更改为非私有代码破坏了您的代码。