2013-09-23 3 views
2

Есть ли способ скомпилировать и загрузить класс Java во время выполнения без создание и сохранение файла в файловой системе операционной системы?Динамическая загрузка классов с использованием только строки

Скажем, у меня есть запись базы данных, которая содержит строковое представление класса java. Я вытаскиваю эту строку в память Java. Моя цель - скомпилировать эту строку в класс java, а затем загрузить этот класс.

Позвольте мне пояснить это. Я не хочу иметь ничего общего с файлами .java или .class в любой операционной системе.

Возможно ли это? И как?

Например, вот код для загрузки Groovy класса во время выполнения, и вызвать метод:

ClassLoader parent = getClass().getClassLoader(); 
GroovyClassLoader loader = new GroovyClassLoader(parent); 
Class groovyClass = loader.parseClass(new File("src/test/groovy/script/HelloWorld.groovy")); 

// let's call some method on an instance 
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance(); 
Object[] args = {}; 
groovyObject.invokeMethod("run", args); 

, но мы можем сделать что-то вроде:

ClassLoader parent = getClass().getClassLoader(); 
    GroovyClassLoader loader = new GroovyClassLoader(parent); 
    Class groovyClass = loader.parseClass(new String("public class GroovyClass{}")); 

?

+1

Я ничего не знаю о ответе, но интересуюсь случаем использования. Какую проблему вы пытаетесь решить этим. – RandomQuestion

+0

Вот проблема: я создаю студию управления базой данных для базы данных объектов (используя db4o). Скажите, что пользователь студии хочет переключать базы данных. С помощью базы данных Object классы java представляют собой представление таблиц/схем и т. Д. Поэтому, когда вы переключаете базы данных, вам приходится динамически загружать новые классы Java в память, потому что эти классы необходимы для описания базы данных. Скажем, пользователь хочет добавить новую запись. Им нужно вызвать Class.newInstance() для определенного И существующего Java-класса, который уже загружен в JVM. –

+1

Ответ на этот код может быть очень длинным, но вот моя ссылка, когда у меня был тот же случай. [Компиляция в памяти] (http://www.javablogging.com/dynamic-in-memory-compilation/). –

ответ

2

Да, у меня есть библиотека, которая называется OpenHFT/Java-Runtime-Compiler, которая заменяет essence jcf. Есть и другие библиотеки, такие как beanshell и groovy, которые поддерживают это, но я не использовал их сам.

+0

, которые это делают? –

+0

есть GroovyClassLoader, но это загружается из файла .groovy. Можно ли использовать GroovyClassLoader для загрузки из String? –

+0

Я отредактировал вопрос, пожалуйста, ознакомьтесь с моими изменениями, спасибо –

1

Если вы можете сохранить байт-код, вы должны сделать что-то вроде того, что показано в Javadoc для ClassLoader. Вы просто переопределяете метод findClass(String).

public MyClassLoader extends ClassLoader { 

    public Class findClass(String name) { 
     byte[] b = fetchClassFromDB(String name); 
     return defineClass(name, b, 0, b.length); 
    } 

    private byte[] fetchClassFromDB(String name) { 
     /* Look up class in your database and return it as a byte array. */ 
    } 

} 
+0

Да, это хорошо, позвольте мне дать ему завтрашний день –

Смежные вопросы