【问题标题】:Reflection API - ClassNotFound Exception反射 API - ClassNotFound 异常
【发布时间】:2016-07-22 19:45:39
【问题描述】:

场景:我在驱动器的文件夹中有 java 类。我想从一个特定的类中调用一个方法,比如 Regex。 我可以使用反射 API 来调用方法吗?我有以下代码:

File dir = new File("H:/TestFolder/sample");
    File[] directoryListing = dir.listFiles();
    if (directoryListing != null) {
        for (File child : directoryListing) {
            File[] dirListing = child.listFiles();
            for (File fileName : dirListing) {
                if (fileName.getName().equals("Regex.java")) {
                    Class<?> clazz;
                    try {

                        clazz = Class.forName("Regex");
                        Constructor<?> ctor = clazz.getConstructor();
                        Object regexClass = ctor.newInstance();
....}

我得到 ClassNotFoundException。谁能告诉我我做错了什么?

【问题讨论】:

  • 首先,类不能从Java源文件中加载,它必须被编译。如果您想从文件夹中加载已编译的类文件,请检查 this
  • 我会检查 Regex.class 是否在默认包的类路径中。
  • @PeterLawrey 先生,您不认为Class.forName(..) 中缺少的包名是造成这种情况的原因吗?我在答案部分提到了这一点。如果我错了,请纠正我。
  • @PeterLawrey 哦,是的。我错过了。我会更新答案。谢谢,先生。
  • @PeterLawrey 哦,是的。绝对地。请进行您认为必要的任何修改。

标签: java reflection classnotfoundexception


【解决方案1】:

这个类实际上叫做[packageName].Regex,因为你已经在一个叫做[packageName]的包中声明了它。

编辑。 Peter Lawrey 指出,如果源是 H:/TestFolder/sample,则包必须是 sample。所以这个类将被称为sample.Regex,而不是Regex。这是假设基础包不是TestFolder。如果是,那么TestFolder.sample.Regex。我相信你明白了。请阅读Lawrey先生的评论below

Class.forName() 采用指定包名的类名。来自 className 变量的 [docs],

className - 所需类的完全限定名。

此特异性应采用ClassNotFoundException

注意。我期待您的Regex.java 已编译为生成Regex.class 文件。您的 IDE 应该已经这样做了。

【讨论】:

  • 要知道它是哪个包,请查看.java 文件开头的package xxx; 行。如果没有这样的行,它在默认包中。
  • 我没有包裹。它是 JavaProject 名称。它是样本(对不起,错字样本)。
  • 那么,您的文件顶部没有说明包,还是称为sampleSample?如果您在原始帖子中更新它会很好。 旁注。如果您没有列出包,最好有一个包,而不是使用(default package)
【解决方案2】:

可能是一个愚蠢的问题,但是。您是否检查过这些类是否在类路径中?

我的意思是。该文件夹是代码的 src 还是您要检查和加载的外部文件夹?

类应该在类路径中,以便通过反射初始化它们的对象。

【讨论】:

  • 它是外部文件夹。所以你的意思是我不能从外部文件夹检查和加载?
  • 您可以检查。但是这些文件就像文本平面文件:-)。不像可执行类。
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多