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

dev*_*ium 1 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 classLoader = new URLClassLoader(urls);
Class<?> targetClass = classLoader.loadClass("a.b.c.MyClass");
Run Code Online (Sandbox Code Playgroud)

强迫我们将.class文件放在反映其完整内部名称的目录结构中是疯狂的,IMO.我错过了什么吗?

这个事实的一个可能的暗示是,如果我决定将几个.class文件复制到一个临时目录中,这样我就可以对它们执行一些非常棒的操作,我将不得不在同一个临时目录中复制它们的所有脏路径,这是尴尬,充其量.

Ste*_*n C 6

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

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

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