Pergunta

um colega me indicou outro dia para BCEL que, pelo que posso perceber pela explicação dele e por uma leitura rápida, é uma forma de modificar em tempo de execução o código de bytes.Meu primeiro pensamento foi que parecia perigoso, e meu segundo pensamento foi que parecia legal.Então pensei mais um pouco e lembrei-me do postagem de codinghorror sobre patch de macaco e percebi que isso era basicamente a mesma coisa.Alguém já usou o BCEL para algo prático?Estou certo de que isso é basicamente um patch de macaco em tempo de execução ou estou faltando alguma coisa?

Foi útil?

Solução

É um pouco mais de baixo nível do que o clássico patch de macaco e, pelo que li, as classes já carregadas na VM não são atualizadas.Ele apenas suporta salvá-lo em arquivos de classe novamente, não modificando as classes de tempo de execução.

Outras dicas

Das perguntas frequentes do BCEL:

P:Posso criar ou modificar classes dinamicamente com o BCEL?

A:O BCEL contém classes úteis no pacote Util, nomeadamente ClassLoader e Javawrapper.Take uma olhada no exemplo do proxyCreator.

Mas o patch de macaco é...hum...controverso e você provavelmente não deveria usá-lo se seu idioma não for compatível.

Se você tiver um bom caso de uso, posso sugerir incorporar o Jython?

Você pode ver isso como um patch de macaco.Prefiro não usá-lo (talvez nunca tenha enfrentado um bom caso de uso para ele?), mas estar familiarizado com ele (para ter uma ideia de como o Spring e o Hibenrate o utilizam e por quê).

Veja este exemplo do mundo real: Jawk - Módulo Compilador.BCEL é útil para "compilação" de sua linguagem personalizada.

BCEL não oferece suporte a monkey patching, ele apenas manipula o bytecode e possivelmente o carrega em um carregador de classe personalizado.No entanto você pode implementar monkeypatching na JVM usando biblioteca como BCEL e agente Java.O agente Java (carregado pelo argumento -javaagent) pode acessar a API de instrumentação e modificar classes carregadas.Não é difícil implementá-lo através de algumas pontes.

Mas lembre-se:

  • Não tenho certeza se ter que usar -javaagent é algo que você deseja.
  • Em qualquer linguagem, o monkey patching pode levar a um comportamento pouco previsível.
  • Você pode modificar um método.Em teoria, você também pode adicionar algum método, mas precisa compilar o projeto com base em classes modificadas (corrigidas).Acho que isso causaria muita dor e não vale a pena.Existem idiomas alternativos que o suportam (por exemploGroovy) ou apoiar algo semelhante (por exemploconversões implícitas em Scala).
  • É melhor projetar bem sua API do que usar monkey patching.Pode ser bastante útil para bibliotecas de terceiros.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top