Gerar uma classe e instanciar um objeto sem um arquivo físico. Tem Como?

12 respostas
Zakim

Saudações…

Exite alguma forma de criar uma classe em tempo de execução e instanciar um objeto desta sem a necessidade de um arquivo físico (.java)? Como por exemplo criar uma entidade empresa em tempo de execução e a utiliza-la em memória?

Alguem tem algo a dizer? :stuck_out_tongue:

grato.

12 Respostas

T

http://asm.objectweb.org/

A propósito, por que é que você quer fazer isso?

peczenyj

Para fazer o que vc quer não bastaria uma linguagem dinamica sobre a JVM como Groovy, JPython ou JRuby? A API de Scripting do java 1.6 não pode ajudar?

Ou talvez fazer uso de Dynamic Proxy…

Zakim

O principal objetivo seria eliminar o número de arquivos (.java). Em especial os POJO’s.

O que acham?

A manutenibilidade está se tornando um caos, por conta do expressivo númeo de pojos que fazem o mesmo feijão com arroz de sempre. Quero elimina-los, mas ainda não sei exatamente como farei e se realmente farei.

renzonuccitelli

Se eles fazem o mesmo arroz com feijão de sempre, é bem provavel que vc consiga reduzir esse número utilizando Reflection e Annotations. Na mundoJava número 19 tem um bom exemplo disso. Só tem que ficar esperto pra ver se a perda de desempenho no uso dessas ferramentas nao vai comprometer o desempenho total de sua aplicação.

Zakim

Sim, mas ai eu caio em outro problema! A produtividade!

na verdade eu gostaria de criar um espelho do banco de dados em tempo de execução sem a necessidade de se criar POJO’s com anotações.

Com dynamic Proxy eu ainda teria que criar as interfaces certo?

peczenyj

Tudo bem.

Digamos que vc tem essa tabela

Pessoa { id (numerico) nome_txt (string, no maximo 80) data_nasc (data) salario (number 8 com 2 casas decimais) }

Digamos que vc consiga gerar um objeto que represente essa entidade. Como vc pretende trabalhar com ele?

Assim?

salario = pessoa.getSalario();

Ou algo assim?

quantidade = objeto.daTabela("Pessoa").comColuna("salario");

Isto é… não vejo a produtividade que vc espera ter…

Zakim
//mapa que guardaria o nome da coluna e o valor do resultado informado pelo ResultSet. Que por sua vez
//me passaria todas as caracteristicas necessárias para lidar com uma possivel geração de telas a partir do //metadata
do ResultSet.
Map<String, Object> mapaResultSet;

Isso seria mais produtivo! Porém com qualidade inferior :frowning:

victorwss

Valder, os métodos defineClass da classe ClassLoader são o caminho a tomar. Você passa um array de bytes e ele magicamente cria uma classe.

A parte difícil é preencher o array. :lol:

Não acho que Dynamic Proxy vai resolver o seu problema.

Para fazer isso, você vai ter que brincar um pouco com geração de bytecode on-the-fly (o que é difícil pra cacete). Mas como os métodos que você vai gerar são provavelmente apenas getters e setters burros, não há de ser tão difícil. Ainda mais se você arrumar alguma biblioteca por aí que faça isso (deve existir, mas não sei).

Zakim

Andei pesquisando sobre Dynamic Proxy e realmente ele não é o caminho!

O caminho está a cada dia mais longo…

Vou dar uma olhada nisso Victor…

Obrigado!

victorwss

Zakim:
Andei pesquisando sobre Dynamic Proxy e realmente ele não é o caminho!

O caminho está a cada dia mais longo…

Vou dar uma olhada nisso Victor…

Obrigado!

Mas, lembrei de um detalhe importante. O compilador não será capaz de determinar quais são os métodos e atributos da classe, o que força você a determiná-los por reflection, aumenta grotescamente a complexidade e acaba com a sua produtividade, e no final não te leva a lugar algum. Neste caso um Map<String, Object> seria algo muito mais simples.

Ou seja, talvez o caminho seja criar uma ferramenta que crie arquivos .java a partir do BD, compile-os em .class e coloque-os em um jar no classpath, de forma que o compilador fique feliz em vê-los. Algo que é bem mais simples do que brincar com ClassLoaders.

C

Zakim:
O principal objetivo seria eliminar o número de arquivos (.java). Em especial os POJO’s.

O que acham?

A manutenibilidade está se tornando um caos, por conta do expressivo númeo de pojos que fazem o mesmo feijão com arroz de sempre. Quero elimina-los, mas ainda não sei exatamente como farei e se realmente farei.

Se vc quer eliminar POJOs, nao deveria estar programando em Java.

Mas acho que vc quis se referir a objetos anemicos, ou seja, que servem apenas como cointainers de dados… 8)

victorwss

cmoscoso:
Zakim:
O principal objetivo seria eliminar o número de arquivos (.java). Em especial os POJO’s.

O que acham?

A manutenibilidade está se tornando um caos, por conta do expressivo númeo de pojos que fazem o mesmo feijão com arroz de sempre. Quero elimina-los, mas ainda não sei exatamente como farei e se realmente farei.

Se vc quer eliminar POJOs, nao deveria estar programando em Java.

Mas acho que vc quis se referir a objetos anemicos, ou seja, que servem apenas como cointainers de dados… 8)

Exatamente. Classes que são apenas um construtor público, sem parâmetros e vazio com um monte de atributos, cada um tendo um getter e um setter burro. E também tem um método clone() e de vez em quando um equals(Object) ou um hashCode(). Ou seja, os infâmes VOs.

Criado 17 de novembro de 2008
Ultima resposta 21 de nov. de 2008
Respostas 12
Participantes 6