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

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

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)

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

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

 ArtoAle27 янв. 2011 г., 09:15
Потерял аналогичного answare :)
 ArtoAle25 янв. 2011 г., 17:56
Спасибо, я пойду этим путем!
 Riduidel25 янв. 2011 г., 17:59
@ArtoAlo тогда почему ты принял другой ответ?
 ArtoAle27 янв. 2011 г., 10:19
Из-за многих похожий ответ! :)

и если это возможно, вы должны избегать генерации классов во время выполнения, но иногда вы должны это делать. Таким образом, вы можете использовать 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. Также я добавил метод в этот класс и через рефлексию вызвал его.

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

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

Решение Вопроса

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

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

 dtortola23 июл. 2015 г., 09:38
другой случай - создать класс, аннотированный чем-то, например, для использования с ApplicationContext в качестве дополнительного класса конфигурации.
 Snekse31 мая 2013 г., 17:37
Я просто пытался ответить на вопрос, что вы можете сделать с таким динамически генерируемым классом. Мы собираемся попробовать что-то подобное, но я думаю, что мы собираемся исследовать Groovy, прежде чем идти по пути .reflect.Proxy или тому подобное.
 Michael Borgwardt30 мая 2013 г., 00:29
@Snekse: динамически реализовать интерфейсы довольно просто, используя java.lang.reflect.Proxy
 ArtoAle25 янв. 2011 г., 17:14
Спасибо, вы поняли! это esangui, что мне нужно :)
 Snekse30 мая 2013 г., 00:17
Одним из вариантов использования будет генерация класса, реализующего интерфейс, о котором знает ваш статический код. Я исследую эту тему, потому что у нас есть приложение, которое работает со смешанной схемой базы данных, поэтому столбцы могут существовать или не существовать.

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

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

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

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

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

веселит,

игорь

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

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

возможно компилировать классы во время выполнения. Я делал это раньше в исследовании генетических алгоритмов. Это возможно, используя встроенный интерфейс к компилятору. Статья в Java World описывает базовый подход:http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html?page=3

java.lang.reflect.Proxy и связанные классы.

 Michael Borgwardt25 янв. 2011 г., 15:46
Для этого необходим интерфейс, поэтому в этом сценарии он совершенно бесполезен.
 Pointy25 янв. 2011 г., 17:12
@ Спасибо спасибо, но нет, я не растерялся. Просто неправильно :-)
 Pointy25 янв. 2011 г., 15:48
Ну, я согласен, что это правда, но вопрос не совсем твердый.
 Stijn de Witt26 авг. 2014 г., 20:54
Не обязательно неправильно; Думаю об этом. Какой смысл иметь реальный метод, если он не существует ни в одном интерфейсе? Как бы вы использовали его любым способом, который принесет вам пользу от того факта, что это настоящий статически типизированный метод?
 Sean Patrick Floyd25 янв. 2011 г., 16:05
Я думаю, что вы перепутали механизм прокси JDK с библиотеками, управляющими байт-кодом, такими как asm или cglib

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

 ArtoAle25 янв. 2011 г., 17:13
Да, может быть, вы правы ... иль на спячка!
 EGHM23 нояб. 2015 г., 21:54
Использование CodeModel для сужения класса, который я еще не создал, было проблематичным, эта статья тривиально решает мою проблему с помощью Javassist: ClassPool.getDefault (). MakeClass (clazzString) .toClass ();

Ваш ответ на вопрос