Как создать класс динамически в Java - PullRequest
22 голосов
/ 25 января 2011

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

id - unsigned int 
username - varchar(128)
password - varchar(128)

и давайте предположим, что я могу запросить эти данные из моей базы данных. Я хочу динамически создать (и, конечно, создать) класс Java, который должен выглядеть следующим образом:

public class User{
    private unsigned int id;
    private String username;
    private String password;
}

(на самом деле ActiveRecord для моего стола)

Можете ли вы помочь мне начать это? Tnks

Ответы [ 11 ]

19 голосов
/ 25 января 2011

Что бы вы сделали с динамически созданным и созданным экземпляром класса, о котором никто из вашего другого кода не знает?

Для языка со строгой типизацией, такого как Java, не имеет смысла иметь такие классы. С другой стороны, большинство OR Mapper, таких как Hibernate, поставляются с инструментами, которые позволяют статически генерировать классы из схемы базы данных.

17 голосов
/ 25 января 2011

Технически, вы можете через библиотеку манипулирования байт-кодом - CGLIB, javassist, asm, bcel и тому подобное.

Однако это не «философия» Java.Java имеет статическую типизацию, поэтому вам лучше создать классы до выполнения.

Взгляните на hibernate / eclipseLink для Java ORM - способ отображениятаблицы к объектам.

6 голосов
/ 25 января 2011

Я думаю, что вам нужно средство, предоставляемое java.lang.reflect.Proxy и смежными классами.

4 голосов
/ 25 января 2011

Эта хорошая статья для начала, но вы уверены, что вам действительно нужно создать новый класс? Может быть, вы могли бы просто использовать карту?

1 голос
/ 25 января 2011

В статье о "новом" API компилятора и документе Java для JavaCompiler показано, как скомпилировать исходный код Java из String объектов.(Я не знаю, сможем ли мы скомпилировать в выходные потоки и загрузить файлы классов в память ...)

Позже вы можете загрузить файлы классов с помощью URLClassLoader и создавать экземпляры (reclection /API вызова)

1 голос
/ 25 января 2011

Как и @ @ Божо, Java - это статически типизированный язык, для которого генерация классов во время выполнения может привести только к хаосу.

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

0 голосов
/ 09 апреля 2018

Старый вопрос, и если это возможно, вы должны избегать генерации классов во время выполнения, но иногда вам приходится это делать Так что вы можете использовать Javassist, и вот пример ...

Я создал небольшой пример здесь: http://hrabosch.com/2018/04/08/generate-class-during-runtime-with-javassist/

Но вот главное:

public static Class generateClass(String className, String methodName, String methodBody)
  throws CannotCompileException {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.makeClass(className);
StringBuffer method = new StringBuffer();
method.append("public void ")
      .append(methodName)
      .append("() {")
      .append(methodBody)
      .append(";}");
cc.addMethod(CtMethod.make(method.toString(), cc));
return cc.toClass();
}

Итак, что я сделал ... Через Javassist я сделал класс в ClassPool. Также я добавил метод в этот класс и через рефлексию вызвал его.

Надеюсь, это поможет.

Просто помните, что вы хотите использовать в сгенерированном классе, там НЕ импортируются, поэтому вы должны использовать полные имена.

0 голосов
/ 23 июня 2013

Вот одно хорошее решение на основе CGLib:

http://code.google.com/p/cglib-wrappers/wiki/Wrappers

0 голосов
/ 01 июня 2011

Полагаю, конечной целью является создание кода, подобного ActiveRecord, для записи доступа к БД.Если это так, вы можете взглянуть на реализацию ActiveRecord на Java: http://code.google.com/p/activejdbc/

cheers,

igor

0 голосов
/ 25 января 2011

Вы можете сгенерировать исходный текст Java и использовать пакет javax.tools для его компиляции и загрузчик классов для его загрузки. В Google приводятся примеры того, как это можно сделать, но я никогда не пробовал ничего подобного, поэтому не знаю, с какими проблемами вы можете столкнуться. Очевидно, что Java не был предназначен для таких вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...