【问题标题】:Java Reflection library - using Class.forName() without package infoJava 反射库 - 使用没有包信息的 Class.forName()
【发布时间】:2012-06-23 01:50:54
【问题描述】:

我有一个项目需要在运行时动态创建类,其中唯一可用的信息是字符串形式的类名称。我现在正在使用一些简单的反射库方法进行测试,但我的问题是,如果我尝试“动态”加载的类位于同一目录中,为什么我必须提供完全限定的类名称?我使用的是linux,没有开发环境,只是我试图在同一个目录中调用的所有类,没有任何包声明。我必须设置一个包系统才能使用反射吗?这是这个小代码sn-p....

public class ReflectionTest {
    public static void main(String[] args) {
        try {
            Class nodeClass = Class.forName("Node");
            System.out.println(nodeClass.toString());
        } catch (ClassNotFoundException cnfe) {
            System.out.println("Error");
        }
    }
}

现在,这会引发错误。但是当我创建一个 Node 实例,然后用Node.getClass().getName() 获得它的完全限定类名时,我只得到“Node”作为回报。所以我不明白为什么反射库与使用'java'调用JVM不同,如果没有提供包名,它只是在同一个目录中查找。当我的所有类没有关联的包名称时,我不确定如何将此库与用户定义的类一起使用。

【问题讨论】:

  • 你使用什么命令来运行ReflectionTest?

标签: java class reflection dynamic


【解决方案1】:

首先,您需要确保您尝试加载的类位于类路径中,因此在启动 jvm 时尝试将当前文件夹添加到其中:java -cp . ReflectionTest

包的概念是让你的东西井井有条,并且能够重用名称。提供完全限定名称,确保您使用的是正确的 Node 类,例如不是 org.w3c.dom.Node 或 java 隐式附带的类似名称。

【讨论】:

    【解决方案2】:

    使用上面的确切 ReflectionTest.java 和以下 Node.java 对我有用:

    public class Node { }
    

    您是否编译了Node.java 和ReflectionTest.java?由于ReflectionTest 类对Node 类没有编译时依赖,javac 在编译ReflectionTest.class 时不会自动编译Node.class。

    【讨论】:

      【解决方案3】:

      您的代码应该按照描述工作。也就是说,如果您可以拨打new Node(),您也应该可以拨打Class.forName("Node")。我刚刚尝试使用无包类进行验证,一切都按预期工作。

      Node.class 在类路径中可用吗?您可以通过将当前目录添加到类路径来使其工作。

      【讨论】:

      • 这就是我想的哈哈,这真的让我很困惑,是的,一切都被编译了,我可以创建 Node 对象。我会继续玩它,但这很奇怪......
      【解决方案4】:

      Java 中没有类目录的概念。类在包中,或者在默认包中,并且从必须在类路径中的目录或 jar 中加载。

      如果包含Node.class 的目录在类路径中,上面的代码应该可以工作。

      但是使用默认包是一种非常非常糟糕的做法。每个类都应该在一个包中。

      【讨论】:

        【解决方案5】:

        包名是java命名系统的一个组成部分。但是,如果你的类没有声明包,它在根包中,你发布的代码应该可以工作。

        我的猜测:该目录实际上不在 CLASSPATH 中。尝试添加当前目录 (./) 并确保它实际上是当前目录,或者在 CLASSPATH 中明确包含目录(绝对路径)。请参阅文档以了解如何设置 CLASSPATH(环境、jvm 选项、运行时是您的选项)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-17
          相关资源
          最近更新 更多