Creio já saber a resposta mas como um recurso do pessoal mais experiente… gostaria de saber, se é possível com reflection eu criar um método todinho (sim todinho do nome até o código) com reflection em tempo de execução? Tá vão me falar, que se eu quero isso vou usar Python ou Ruby e que no ruby as classes são abertas e por ai vai.
Estou certo e não posso fazer isso e a reflection só serve para recuperar informações e não manipular o código desta forma?
Para criar métodos em tempo de execução ou voce usa scripts, ou entao usa uma bytecodel lib como a CGLib que te indicaram, ou também ASM, BCEL ou o mais simples, Javassist.
Ou seja compreendo então que posso criar métodos em tempo de execução.
Vou falar o que eu quero fazer quem sabe assim você pode me ajudar um pouco melhor…
Na realidade quero fazer um servidor de banco de dados mock mas na implementaçãoq ue eu propust a apresentar eu iria usar um modelo nas classe semelhsnte ao ActiveRecord (bem coisa do rails) e as classes de modelo teria aqueles métodos find_by_atribute, e os métodos não teria de ser criados na classe logo de inicio.
A classe vai ler a tabela do banco de dados e as classe JavaBeans seria criadas meio que automáticamente, mas com métodos do A.R. como esses finders.
Pode parecer fora comum, ou coisa do tipo, mas é apenas uma demonstração para faculdade. Só isso.
Devido a essa falta de poder em Java que estou aprendendo outra linguagem. Estou vendo Lua agora. Comparando Java ao ActionScript, vc chega a conclusão que o Reflection em Java é uma piada de mau gosto. Parece o governo brasileiro, criando dificuldades para vender soluções :twisted:
Bem Renzo, não sou de todo a favor da sua opinião. Até achoa tecnologia java uma boa. Ok pode ter umas limitações, mas vamos levar em conta que, quando foi criado, java era o graal do desenvolvimento, o mesmo código funcionar em linux, window e mais???
Bem acho que a tecnologia está andando, tende a evoluir, o jruby tá ai para ensinar algumas coisa, o java 7 também vai trazer coisas novas.
Agora acho muito importante conhecer outras tecnologias, principalmente as de script.
Já fui praticamente um Evangelista Java. Hj penso o seguinte: Java é bom pra quem está começando, pois é tão estático e amarrado que “ajuda” os desenvolvedores mais novos a não fazerem besteira. Quando vc pega uma experiência, começa a ver como Java é limitado. Indo direto ao fator de criação desse tópico, para criar um método em tempo de execução vc tem que usar um CGLib ou ASM da vida, tendo que pegar todo um framework pra fazer algo que é ridículamente simples de se fazer em Lua ou Python.
Além disso, vc fica bitolado, pensando que só dá para usar poliforfismo com herança. Recomendo darem uma olhada nos livros da linguagem Lua feito pelo pessoal da PUC-RJ. Isso sim é portabililidade, onde o código do interpretador possui 4k linhas. Em um capítulo com 20 páginas ele explica como fazer herança e herança múltipla na linguagem e te abre a mente com relação a conceitos de OO.
Há um ano atrás eu não estava preparado para entender os conceitos do livro, talvez por Java ser na época minha linguagem favorita, mas hj simplesmente eu acho Java extremamente improdutivo. Tanto é que são necessários vários frameworks para suprir as deficiências da linguagem, vide Hibernate, Spring, Extream (não lembro se escreve assim), Jodatime, Struts e infinitos outros que eu poderia encher essa tela toda.
[]s
PS: Ainda desenvolvo em Java no trabalho e não acho que Java vai acabar, muito pelo contrário.
O que você pretende demonstrar nesse trabalho, a inteligência do “find_by” ou os métodos dinâmicos propriamente ditos?
Eu pensei em uma coisa, caso vc queira permanecer na linguagem Java pura e o foco do seu trabalho não seja exatamente o uso do reflection / métodos dinâmicos.
Poderia receber essa consulta em um parâmetro, por exemplo:
record.query("find by name", "GUJ");
Aí vc interpretaria essa string com a solicitação, e poderia inclusive adicionar mais opções e ter uma mini-linguagem para consultas.
Então eu quero os métodos dinâmicos, os find_by_atribute, foi apenas um exemplo.
Por método como você sugeriu, também seria uma alternativa, mas… alem de não ser bem o que eu queria, acho que eu posso ter esse método query com muitos ifs ou coisa do tipo.
Uma outra dúvida agora com relação a ASM, CGLib e coisas do tipo. Esses cara são escritos em java e distribuídos em .jar correto? Sendo assim, existe uma técnica/forma de programação que faz com que esses caras consigam o que eu quero correto? Ou seja, framework ou não eles utilizam recursos do próprio java para cumprir com seu objetivo ou por acaso falei besteira???
Só aproveitando o Gancho… isso pode ser feito facilmente com a tal da lambda expression do C#.
No meu trabalho de faculdade, eu precisei fazer uma classe que gerava esses supostos “where” dinamicamente.
Era da seguinte forma:
Passava uma Entity para um metodo que percorria todas as propriedades vendo via Reflection se alguma estava preenchida e montava o select.