声明库包的类时发生IllegalAccessError

时间:2019-03-25 13:57:11

标签: java spring gradle apache-kafka apache-kafka-streams

我目前正在维护未公开代码的维护,并且在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

1 个答案:

答案 0 :(得分:0)

不确定要完成什么,但是AbstractStreamKTableImpl来自软件包org.apache.kafka.streams.kstream.internals,而不是公用API的一部分(顾名思义)。这意味着可以在不通知的情况下添加/删除方法(甚至整个类)。

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