Можно ли открыть файл .txt / .java, содержащий класс и использующий отражение в нем? - PullRequest
4 голосов
/ 26 марта 2012

Под этим я подразумеваю открытие файла с кодом Java как класса, а не файла. В общем, я хочу:

-> Открыть чистый текстовый файл в самостоятельно написанном Java-приложении (.txt / .log / .java) -> Распознать класс (ы) в файле, например:

public class TestExample { 
private String example; 

public String getExample() { 
return example; 
} 
} 

Я открою это в рукописной программе. Вместо того, чтобы распознавать текст в файле как строку или как чистый текст, он найдет в нем класс TestExample. Тогда это сохранит это как Класс.

-> Использовать Reflection API в классе -> Получить поля, методы и т. Д. Из файла и отобразить их

Возможно ли это?

Ответы [ 4 ]

2 голосов
/ 26 марта 2012

Да, это возможно.

Посмотрите на этот пример.

http://weblogs.java.net/blog/malenkov/archive/2008/12/how_to_compile.html

Знание, как находить и читать файлы (что действительно просто)Затем вы можете использовать показанный код, особенно

javax.tools.JavaCompiler
javax.tools.ToolProvider.getSystemJavaCompiler()

, чтобы скомпилировать код и затем вызвать его с помощью отражения.

1 голос
/ 26 марта 2012

Возможно, вы захотите взглянуть на Beanshell .

1 голос
/ 26 марта 2012

Вы можете скомпилировать код Java "на лету". См. Пример: Как на лету скомпилировать исходный код Java, содержащийся в строке?

Создание загрузчика классов и использование отражения

0 голосов
/ 25 марта 2016

Я знаю, что это старый, но хотел добавить в тему:

Да, это возможно. В основном вы используете класс JavaCompiler в java для компиляции любой строки во время выполнения и возврата экземпляра java.lang.Class, который можно использовать для создания экземпляра объекта.

Я написал небольшую минимальную библиотеку для проекта, над которым я сейчас работаю. Не стесняйтесь использовать библиотеку, как вы хотите. EzReflection позволяет вам полностью скомпилировать код в памяти, не требуя записи файла .class.

Используя ezReflections, ваш код будет выглядеть так:

InMemoryEzReflectionsCompiler compiler = new InMemoryEzReflectionsCompiler();
String src = new Scanner(new File("filename")).useDelimiter("\\Z").next();
Class<?> cls = compiler.compileClass("name of class", src);
// if your class doesn't require arguments in the constructor
cls.newInstance();
// if your class requires arguments for the constructor. Here assuming one Integer and one double   
Constructor<?> cons = cls.getConstructor(new Class[]{Integer.class,double.class});
Object obj = cons.newInstance(new Object[]{(int)10,(double)9});

На странице Github вы также можете найти учебное пособие по использованию ezReflections.

...