磁盘上的.class文件是否必须遵循与其在Java中的限定名称相同的目录结构才能运行它?

磁盘上的.class文件是否必须遵循与其在Java中的限定名称相同的目录结构才能运行它?,java,reflection,classpath,classloader,Java,Reflection,Classpath,Classloader,在阅读了有关动态类加载(即从磁盘加载.class文件)的内容后,我有点担心 假设我有一个名为MyClass.class的文件,其中包含类a.b.c.MyClass。 假设我现在决定将文件移动到C:\(Windows中的根文件夹),我想动态加载这个类。这有可能吗?据我所知,似乎MyClass”路径的形式总是*a/b/c.MyClass 因此,以下代码似乎不起作用: URL[] urls = new URL[] { new File("C:\\").toURL() }; URLClassLoader

在阅读了有关动态类加载(即从磁盘加载.class文件)的内容后,我有点担心

假设我有一个名为
MyClass.class
的文件,其中包含类
a.b.c.MyClass
。 假设我现在决定将文件移动到
C:\
(Windows中的根文件夹),我想动态加载这个类。这有可能吗?据我所知,似乎
MyClass
”路径的形式总是
*a/b/c.MyClass

因此,以下代码似乎不起作用:

URL[] urls = new URL[] { new File("C:\\").toURL() };
URLClassLoader classLoader = new URLClassLoader(urls);
Class<?> targetClass = classLoader.loadClass("a.b.c.MyClass");
URL[]URL=newurl[]{new File(“C:\\”).toURL()};
URLClassLoader=新的URLClassLoader(URL);
Class targetClass=classLoader.loadClass(“a.b.c.MyClass”);
强迫我们把一个
.class
文件放在一个反映其完整内部名称的目录结构中是愚蠢的,依我看,我是不是遗漏了什么

这一事实可能意味着,如果我决定将两个
.class
文件复制到一个临时目录中,以便对它们执行一些可怕的魔法,那么我将不得不在同一个临时目录中复制它们的所有脏路径,这是最尴尬的

磁盘上的.class文件是否必须遵循与其在Java中的限定名称相同的目录结构才能运行它

是的,如果您使用的是标准类加载器

理论上,您可以实现一个自定义类加载器,该加载器使用不同的方案来定位类文件。但是(例如)调试代码时,很有可能会遇到问题。所以我不推荐它

磁盘上的.class文件是否必须遵循与其在Java中的限定名称相同的目录结构才能运行它

是的,如果您使用的是标准类加载器


理论上,您可以实现一个自定义类加载器,该加载器使用不同的方案来定位类文件。但是(例如)调试代码时,很有可能会遇到问题。所以我不建议您这样做。

您需要向类装入器提供完全限定的类名(即与包一起提供)。我真的不理解您的问题。
a/b/c
“脏”有什么问题?为什么您需要将某些内容放在临时目录中才能使用它们?嗯,这是一个自作自受的问题。@middus:编译器相关的东西。但是为什么你模糊的“编译器相关的东西”关心文件在哪个目录中?@middus:假设我处理的类有大的限定名,并且位于已经大量嵌套的目录中。例如:“D:\projs\ecl\workspace\xyz\tests.unit\bin\tests\system\bytecode\params\u element\”将变成“D:\projs\ecl\workspace\xyz\tests.unit\bin\tests\system\bytecode\params\u element\tests\system\bytecode\params\u element\”。您需要提供完全限定的类名(即与包一起提供)我真的不明白你的问题。
a/b/c
“脏”有什么问题?为什么您需要将某些内容放在临时目录中才能使用它们?嗯,这是一个自作自受的问题。@middus:编译器相关的东西。但是为什么你模糊的“编译器相关的东西”关心文件在哪个目录中?@middus:假设我处理的类有大的限定名,并且位于已经大量嵌套的目录中。例如:“D:\projs\ecl\workspace\xyz\tests.unit\bin\tests\system\bytecode\params\u element\”将变成“D:\projs\ecl\workspace\xyz\tests.unit\bin\tests\system\bytecode\params\u element\tests\system\bytecode\params\u element\”。