BCEL Byte Code Engineering Library - Usando valores passado por atributo

6 respostas
Marky.Vasconcelos

Olá… via Reflection eu consigo fazer uma Proxy para uma interface e com um InvocationHandler interceptar as chamadas.

O caso é… preciso fazer isso com classes também, não só interfaces.

É possivel fazer isso sem gerar bytecode como o Groovy ou o Hibernate faz?

ty all

6 Respostas

T

Hum… você está me dizendo que todos os métodos dessa classe abstrata têm de ser implementados pelo seu InvocationHandler ou apenas alguns deles?
Acho que o jeito tradicional de fazer o que você quer é criar os bytecodes, em tempo de execução (ou de deployment), de uma classe que estende essa classe abstrata.
A classe java.lang.Proxy faz isso também “por debaixo dos panos”. Ela é implementada, se não me engano, usando-se o BCEL - http://jakarta.apache.org/bcel/ . (Você não vai ver o JAR do BCEL no JDK porque a Sun mudou os packages de “org.apache.bcel” para “sun.org.apache.bcel” para pôr uma cópia própria e privada do BCEL dentro do JDK).
Mas se você fizer isso, use o Javassist ou o ASM.

Marky.Vasconcelos

Seriam todos sim… é que eu estou trabalhando em uma linguagem de Script e consegui direcionar os chamados da interface para rodar o respectivo código do script… mas queria fazer isso para classes também.

Vou dar uma estudade no Javassist e o no ASM

fwbrasil

Também tem o CGLib que faz esse trabalho.

Marky.Vasconcelos

Escolhi o próprio BCEL para fazer isso, e estou usando os pacotes que já vem com o JRE.

Mas agora estou com uma duvida.

No BCEL como eu consigo acessar os parametros que foi passado no metodo que estou construindo?

T

O BCEL tem um nível muito, muito baixo para ser útil para resolver o seu problema.
Não dá para usar o JavAssist? Ele já resolve todos esses problemas que você vai encontrar.

Marky.Vasconcelos

Eu queria evitar ter que depender de jars adicionais para funcionar. Eu vi que o Java tem internamente o BCEL e o ASM.

E para falar a verdade minha intenção não é mais criar uma classe que extende uma minha… eu quero criar uma nova em runtime.

Eu continuo usando o BCEL? Vou pro ASM? ou então desisto da ideia de ter mais jars e uso o JavaAssist?

Criado 11 de março de 2009
Ultima resposta 12 de mar. de 2009
Respostas 6
Participantes 3