JPype ImportError: Class `MyClass` 被发现但不是预期的 (!?)

问题描述

今天,我在 JPype 中遇到了我最初认为是另一个“无法导入”的错误,但是在更深入地查看错误消息后,我立即开始比平时更加​​担心:

JPype error message

错误消息似乎表明该类实际上存在于类路径中并且被正确识别(是的,我已经检查过 Java 类确实存在并且运行良好)但是,出于某种原因,该类不应该在那里:这出乎意料!?

这很奇怪,但更奇怪的是,Google 搜索根本没有结果!就我所见,在撰写本文时,网络上还没有单独提及此类问题。

我所做的是探索JPype的imports.py源代码;相关代码段如下图所示:

JPype's snippet from imports.py

它实际上似乎表明使用 JPype 所采用的认策略未找到该类,但随后它尝试了 JVM 的标准 Class.forName 策略并找到了它!对我来说,这可能比原始错误消息更令人困惑。

我相信我会辞职去运行一个“天真的”试错测试程序,即从有问题的 Java 类中删除所有我可以使用的代码,直到问题消失(如果需要,从一个文件开始!)然后添加越来越多的代码,直到问题再次出现。不幸的是,Java 文件一个非常复杂的类,有 2K+ 行代码,所以这几乎肯定会花费很多时间。

因此我向社区请求帮助:有没有人以前经历过 JPype 的这个奇怪错误?知道在哪里可以简化和加快我的研究过程吗?

不用说,如果我在得到任何答案之前找到解决方案,我当然会在下面分享

解决方法

在完成我的“天真”试错测试程序后,我确实找到了自己问题的解决方案;正如承诺的那样,我会与遇到相同问题的任何人分享我在此处找到的内容。

基本上,问题的根源在于我们“忘记”在 (!)该类设置为包私有。洞察力很好地解释了奇怪的错误消息:Class was found but not expected。是的,这意味着:“课程实际上在那里,但它不是公开的,所以很抱歉你不能使用它”。

也许一个稍微更清楚的错误消息可以为我节省几个小时的测试时间,但仅此而已。更改 Java 包中违规类的声明:

class lljavaPDFTextStripper { ... }

public class lljavaPDFTextStripper { ... }

解决了问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...