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?
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?
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 //metadatadoResultSet.Map<String,Object>mapaResultSet;
Isso seria mais produtivo! Porém com qualidade inferior
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
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)
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.