2011-01-25 22 views
22

Non so se questo sia possibile. Ad ogni modo, ecco il mio problema: voglio creare una classe con uno schema di tabella di database, ad esempio, supponiamo che ho un tavolo comeCome creare una classe dinamicamente in java

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

e supponiamo posso interrogare questo i dati dal mio db. Quello che voglio fare è quello di creare in modo dinamico (e, naturalmente, l'istanza) di una classe Java che dovrebbe essere simile a questo:

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

(in realtà un ActiveRecord per la mia tabella)

mi potete aiutare a partire Questo? Tnks

risposta

19

Cosa vorresti fare con una classe creata dinamicamente e istanziata di cui nessuno del tuo altro codice è a conoscenza?

Per un linguaggio tipicamente scritto come Java, non ha senso avere tali classi. D'altra parte, la maggior parte dei mappatori OR come Hibernate sono dotati di strumenti che consentono di generare staticamente classi da uno schema di database.

+1

Grazie, hai capito! questo è esangui quello di cui ho bisogno :) – ArtoAle

+2

Un caso d'uso genererebbe una classe che implementa un'interfaccia di cui il tuo codice statico conosce. Sto ricercando questo argomento perché abbiamo un'applicazione che funziona contro uno schema di database misto, quindi le colonne possono o non possono esistere. – Snekse

+0

@Snekse: l'implementazione dinamica delle interfacce è abbastanza semplice, utilizzando java.lang.reflect.Proxy –

17

Tecnicamente, è possibile, tramite una libreria di manipolazione bytecode - CGLIB, javassist, asm, bcel e simili.

Tuttavia, questa non è la "filosofia" Java. Java è tipizzato staticamente, quindi è meglio creare le classi prima del runtime.

Dai un'occhiata a hibernate/eclipseLink per Java ORM: un modo per mappare le tabelle agli oggetti.

6

Penso che quello che vuoi è la struttura fornita da java.lang.reflect.Proxy e classi correlate.

+1

Ciò richiede un'interfaccia per esistere, quindi abbastanza inutile in questo scenario. –

+1

Beh, sono d'accordo che è vero, ma la domanda non è esattamente solida come la roccia. – Pointy

+0

Penso che tu abbia confuso il meccanismo del proxy JDK con le librerie di manipolazione bytecode come asm o cglib –

4

This è un buon articolo per iniziare, ma sei sicuro di aver bisogno di creare effettivamente una nuova classe? Forse potresti semplicemente usare una mappa?

+0

Sì, forse hai ragione ... va d'accordo con l'ibernazione! – ArtoAle

+0

Utilizzare CodeModel per restringere a una classe che non ho ancora creato era problematico, questo articolo risolve banalmente il mio problema, tramite Javassist: ClassPool.getDefault(). MakeClass (clazzString) .toClass(); – EGHM

1

Come @Bozho afferma, Java è un linguaggio tipizzato in modo statico per cui la generazione di classi in fase di runtime può solo portare a disordini.

Nel nostro mondo, è molto più conveniente generare classi in fase di compilazione, ovvero durante la compilazione. Tipicamente, utilizzando Hibernate reverse engineering, è possibile creare classi Java dallo schema DB in fase di compilazione e distribuire tali classi nell'applicazione, che forniscono codice Java autentico da leggere, con la garanzia che il codice sarà associato allo schema DB

+0

Grazie, andrò da questa parte! – ArtoAle

+0

@ArtoAlo, allora perché mai hai accettato un'altra risposta? – Riduidel

+0

Lost of similar answare :) – ArtoAle

0

È possibile generare il testo di origine Java e utilizzare il pacchetto javax.tools per compilarlo e un programma di caricamento classi per caricarlo. Googling fornisce alcuni esempi su come può essere fatto, ma non ho mai provato nulla del genere, quindi non so quali problemi potresti incontrare. Chiaramente, Java non è stato progettato per queste cose.

1

The Article sulla "nuova" API del compilatore e il documento java per JavaCompiler mostrano un modo su come compilare l'origine java dagli oggetti String. (Non so se possiamo compilare i flussi di output e caricare i file di classe in memoria ancora ...)

È possibile caricare i file di classe in seguito con un URLClassLoader e creare istanze (reclection/invocazione API)

0

Suppongo che l'obiettivo finale è quello di avere ActiveRecord- codice come per l'accesso in scrittura DB. Se questo è il caso, si può dare un'occhiata a implementazione Java di ActiveRecord: http://code.google.com/p/activejdbc/

applausi,

Igor

Problemi correlati