Учитывая только полный путь к файлу .class, как я могу загрузить его объект Class? - PullRequest
0 голосов
/ 25 апреля 2019

Я работаю над приложением, которое должно уметь анализировать код Java; некоторые через текст, а некоторые через размышление. Пользователь должен иметь возможность ввести каталог, и программа извлечет из него все файлы .java и .class. У меня нет проблем с файлами .java, но когда я пытаюсь получить класс файла .class, он не работает.

Я смотрел на использование ClassLoader с URL. То, что я смог найти до сих пор, дало мне это

URL url = this.openFile().toURI().toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass(this.path);
return cls;

path - это просто строка, содержащая фактический путь к рассматриваемому файлу .class, например, Users/me/Documents/Application/out/production/MyPackage/MyClass.class. Из того, что я понимаю из своего собственного чтения, этот метод связывает меня со знанием структуры пакета ввода, но в целом я не знаю. Все, что у меня есть, это абсолютный путь к файлу .class. Есть ли способ, просто используя этот путь (или какое-то простое его преобразование), чтобы я мог загрузить в свою программу фактический объект класса MyClass и начать отражать его?

1 Ответ

2 голосов
/ 25 апреля 2019

У вас есть 2 варианта:

  1. Используйте библиотеку байт-кода, чтобы сначала прочитать файл, чтобы вы могли узнать, каково действительное имя класса.

    например. в вашем примере это, вероятно, MyPackage.MyClass, но вы не можете знать это по полному имени файла.

  2. Реализация собственного подкласса ClassLoader и вызов defineClass(byte[] b, int off, int len).

Рекомендовать использовать вариант 2.

...