Есть ли способ получить исходный код Java из имени класса?Например: ...
Вам может потребоваться одно из нескольких возможных решений.Не зная, что вы действительно хотите сделать с информацией, мы не можем быть очень точными с нашими рекомендациями, но я бы начал с того, что по возможности отгоню вас от исходного кода. Исходный код JSE доступен онлайн, как и многие библиотеки с открытым исходным кодом, но это не всегда так.Кроме того, вам нужно поддерживать все это организованным, когда вы захотите его найти, очень похоже на путь к классам, тогда как объекты Class гораздо проще получить и манипулировать ими без необходимости повторного анализа текста.
Reflection
Если вам просто нужна информация о классе во время выполнения, просто используйте Java Reflection API .С его помощью, имея Объект класса , вы можете, например, получить типы определенного поля, перечислить все поля и перебрать их и т. Д.:
Class clazz = User.class;
Field field = clazz.getDeclaredField("var");
System.out.println(field.getType().getName());
Отражениеполезен для поиска информации о классах в программе, и, конечно, вы можете пройтись по всему дереву без необходимости искать исходный код или что-то анализировать.
Помните, что вы можете искать объект класса (если онна пути к классам во время выполнения) с Class.forName("MyClass")
и отражением результирующего класса.
Манипуляция байт-кодом
Если вам нужно больше информации, и вы действительно хотите манипулировать классами, вам нужна манипуляция байт-кодом,Некоторые пытались сгенерировать исходный код, скомпилировать в байт-код и загрузить в свою программу, но поверьте мне - использование надежного API для манипулирования байт-кодом намного, намного проще.Я рекомендую ASM .
С его помощью вы можете не только получать информацию о классе, но и добавлять новые поля, новые методы, создавать новые классы ... даже загружать несколько вариантов классаесли вы чувствуете себя оскорбительным.Примером использования ASM может быть , найденный здесь .
Декомпиляция
Если вам действительно нужен исходный код, а его нет, вы можете декомпилироватьэто из объекта класса, использующего один из различных декомпиляторов.Они используют ту же информацию и методы, что и вышеупомянутые два, но идут дальше и [пытаются] генерировать исходный код.Обратите внимание, что это не всегда работает.Я рекомендую Jode, но приличный список и сравнение с другими доступны онлайн .
File Lookup
Если у вас есть источник, и вы действительно просто хотите посмотреть его, может быть, все, что вам нужно, это поместить файлы .java куда-то в большое дерево и извлекать их по мере необходимости на основе имени пакета.
Class clazz = User.class;
String path = clazz.getPackage().getName().replaceAll("\\.","/");
File sourceFile = new File(path, clazz.getName() + ".java")
Вам нужно больше логики для проверки типа класса, поскольку, очевидно, Примативы не имеют определений классов, и вы хотите обрабатывать типы массивов по-разному.
Вы можете искать класс по имени (если файлы .class находятся в вашем пути к классам) с помощью Class.forName("MyClass")
.