Java反射库-使用Class.forName()而不使用包信息

Java反射库-使用Class.forName()而不使用包信息,java,class,reflection,dynamic,Java,Class,Reflection,Dynamic,我有一个项目,需要在运行时动态创建类,其中唯一可用的信息是字符串形式的类名。我现在正在测试一些死气沉沉的简单反射库方法,但我的问题是,如果我试图“动态”加载的类位于同一目录中,为什么我必须提供完全限定的类名?我使用的是linux,没有开发环境,只是我试图在同一个目录中调用的所有类,没有任何包声明。我是否必须设置一个包系统来使用反射?下面是这个小代码片段 public class ReflectionTest { public static void main(String[] args)

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

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的工作方式不同,如果没有提供包名,它只会在同一个目录中查找。当我的类都没有关联的包名时,我不确定如何将此库与用户定义的类一起使用。

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


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

我使用上面的确切
ReflectionTest.java
和下面的
Node.java

public class Node { }

您是否编译了
Node.java
以及
ReflectionTest.java
?由于
ReflectionTest
类对
节点
类没有编译时依赖关系,因此javac在编译
ReflectionTest.class
时不会自动编译
节点.class
,您的代码应该按所述工作。也就是说,如果您可以调用
newnode()
,那么您还应该能够调用
Class.forName(“节点”)
。我刚刚用一个没有包的类来验证了这一点,一切都按预期进行


类路径中是否有
Node.class
可用?您可以通过将当前目录添加到类路径来实现这一点。

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

如果包含
Node.class
的目录位于类路径中,则上述代码应该可以工作


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

包名是java命名系统不可分割的一部分。但是,如果您的类没有声明包,它位于根包中,那么您发布的代码应该可以工作


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

这就是我所想的哈哈,这真的让我感到困惑,是的,所有内容都已编译,我可以创建节点对象。我会继续玩它,但这很奇怪……您使用什么确切的命令来运行
ReflectionTest