首页 > 解决方案 > 为库包声明类时出现 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

标签: javaspringgradleapache-kafkaapache-kafka-streams

解决方案


不确定您尝试完成什么,但来自包AbstractStream而不是公共 API 的一部分(如名称所示)。这意味着可以在不通知的情况下添加/删除方法(甚至整个类)。KTableImplorg.apache.kafka.streams.kstream.internals

也许可见性enableSendingOldValues()是从public包私有更改为破坏您的代码。


推荐阅读