2011-01-25 42 views
22

No sé si esto es posible. De todos modos, aquí está mi problema: Quiero crear una clase que tiene un esquema de la tabla de base de datos, por ejemplo, supongamos que tengo una tabla comoCómo crear una clase dinámicamente en Java

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

y vamos a suponer que puedo consultar estos datos de mi db. Lo que quiero hacer es crear dinámicamente (y, por supuesto, crear una instancia) una clase Java que debería tener este aspecto:

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

(en realidad un ActiveRecord para mi mesa)

¿Me puede ayudar a comenzar ¿esta? tnks

Respuesta

19

¿Qué hacer con una dinámica creada y crea una instancia de clase que ninguno de sus otros códigos conoce?

Para un lenguaje tipeado como Java, tiene poco sentido tener tales clases. Por otro lado, la mayoría de los OR Mappers como Hibernate vienen con herramientas que te permiten generar clases de manera estática a partir de un esquema de base de datos.

+1

¡Gracias, ya entendiste! esto es lo que necesito :) – ArtoAle

+2

Un caso de uso generaría una clase que implementa una interfaz de la que tu código estático conoce. Estoy investigando este tema porque tenemos una aplicación que se ejecuta en un esquema de base de datos mixta, por lo que las columnas pueden existir o no. – Snekse

+0

@Snekse: la implementación dinámica de interfaces es bastante fácil, usando java.lang.reflect.Proxy –

17

Técnicamente, se puede, a través de una biblioteca de manipulación de código de bytes - CGLIB, javassist, asm, BCEL y los gustos.

Sin embargo, esta no es la "filosofía" de Java. Java tiene tipado estático, por lo que será mejor que cree las clases antes del tiempo de ejecución.

Eche un vistazo a hibernate/eclipseLink para ORM de Java: una forma de asignar tablas a los objetos.

6

Creo que lo que desea es la facilidad proporcionada por java.lang.reflect.Proxy y clases relacionadas.

+1

Eso requiere una interfaz para existir, por lo que es bastante inútil en este escenario. –

+1

Bueno, estoy de acuerdo en que eso es cierto, pero la pregunta no es exactamente sólida como una roca. – Pointy

+0

Creo que confundiste el mecanismo de proxy JDK con las librerías de manipulación de código byte como asm o cglib –

4

This es un buen artículo para empezar, pero ¿está seguro de que necesita crear una nueva clase? ¿Tal vez podrías usar un mapa?

+0

Sí, quizás tengas razón ... ¡sí que estás con hibernación! – ArtoAle

+0

El uso de CodeModel para limitar a una clase que no he creado aún era problemático, este artículo resuelve trivialmente mi problema, a través de Javassist: ClassPool.getDefault(). MakeClass (clazzString) .toClass(); – EGHM

1

Al igual que los estados de @Bozho, Java es un lenguaje estáticamente tipado para el cual la generación de clases en tiempo de ejecución solo puede conducir al caos.

En nuestro mundo, es mucho más conveniente generar clases en tiempo de compilación, es decir, durante la compilación. Típicamente, usando Hibernate reverse engineering, puede construir sus clases de Java desde su esquema de base de datos en tiempo de compilación, e implementar esas clases en su aplicación, que le dan código de autentificación Java para leer, con la garantía de que su código estará vinculado a su esquema DB

+0

¡Gracias, iré por este camino! – ArtoAle

+0

@ArtoAlo entonces, ¿por qué demonios aceptaste otra respuesta? – Riduidel

+0

Perdido de answare similar :) – ArtoAle

0

Puede generar texto fuente Java y usar el paquete javax.tools para compilarlo y un cargador de clases para cargarlo. Google ofrece algunos ejemplos de cómo se puede hacer, pero nunca intenté algo así, así que no sé qué problemas puede encontrar. Claramente, Java no fue diseñado para tales cosas.

1

The Article sobre el "nuevo" Compilador API y el documento de Java para JavaCompiler muestran una forma de cómo compilar origen de Java desde objetos String. (No sé si podemos compilar a las secuencias de salida y cargar los archivos de clase en la memoria aún ...)

Puede cargar los archivos de clase más adelante con un URLClassLoader y crear instancias (reclection/API de invocación)

0

supongo que el objetivo final es tener ActiveRecord- código como para escribir el acceso DB. Si ese es el caso, se puede echar un vistazo a la implementación de Java de ActiveRecord: http://code.google.com/p/activejdbc/

aplausos,

Igor

Cuestiones relacionadas