Должен ли файл .class на диске следовать той же структуре каталогов, что и его полное имя в Java, чтобы мы могли его запустить? - PullRequest
1 голос
/ 12 декабря 2011

После прочтения о динамической загрузке классов (то есть загрузке файла .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");

Заставлять нас помещать файл .class в структуру каталогов, которая отражает его полное внутреннее имя, безумие, IMO. Я что-то упустил?

Возможное следствие этого факта заключается в том, что если я решу скопировать пару файлов .class во временный каталог, чтобы я мог выполнить над ними какое-то удивительное волшебство, мне придется реплицировать все их грязные пути в этом тот же временный каталог, что в лучшем случае неудобно.

1 Ответ

6 голосов
/ 12 декабря 2011

Должен ли файл .class на диске следовать той же структуре каталогов, что и его полное имя в Java, чтобы мы могли его запустить?

Да, если вы используете стандартные загрузчики классов.

Теоретически вы могли бы реализовать собственный загрузчик классов, который использовал бы другую схему для поиска файлов классов. Но есть хороший шанс, что вы столкнетесь с проблемами при (например) отладке кода. Поэтому я бы не рекомендовал это.

...