Pergunta

Estou escrevendo minha tese de mestrado, que lida com AOP no .NET, entre outras coisas, e menciono a falta de apoio à substituição de classes no tempo de carga como um fator importante no fato de que atualmente não há estruturas .NET AOP que executar tecelagem dinâmica verdadeira - não sem impor o requisito de que as classes tecidas devem estender ContextBoundObject ou MarshalByRefObject ou expor toda a sua semântica em uma interface.

No entanto, você pode fazer isso com Java na JVM graças a ClassFileTransformer:

  • Você se estende ClassFileTransformer.
  • Você se inscreve no evento de carga da classe.
  • Na carga da classe, você reescreve a classe e a substitui.

Tudo isso está muito bem, mas meu diretor de projeto me pediu, no último minuto, para dar a ele uma lista de estruturas (e idiomas associados) que não suportam / não suportam a substituição da classe. Eu realmente não tenho tempo para procurar isso agora: não me sentiria confortável apenas fazendo uma pesquisa superficial e potencialmente colocando informações errôneas em minha tese.

Então eu pergunto, oh comunidade de programação todo -poderosa, você pode ajudar? Claro, não estou pedindo para você pesquisar isso. Simplesmente, se você sabe com certeza Que uma estrutura específica suporta / não suporta isso, deixe -a como resposta. Se você não tiver certeza, não se esqueça de apontar.

Muito obrigado!


EDIT: @EWERNLI

  • Estou perguntando sobre (2).
  • Em C#, você pode realmente emitir código no tempo de execução e criar novas classes dinamicamente, mas elas são novo Aulas, eles não substituem uma classe existente. O que eu gostaria de fazer é transformar a classe em tempo de carregamento, como você pode fazer em java com o ClassFileTransformer.
  • Sobre modificar a assinatura de um método: sim, você está certo. Eu deveria ter mencionado que, no meu caso, não quero modificar a interface da classe, mas sim o conteúdo de seus métodos.

Sua resposta foi realmente útil. Obrigada :)

Foi útil?

Solução

Você está perguntando sobre (1) substituição da classe verdadeira em tempo de execução ou (2) instalações para transformar a classe quando ela é carregada ou (3) idiomas que suportam o carregamento de classe dinâmica?

Java suporta a classe dinâmica carregando com ClassLoader, transformação com ClassFileTransformer, mas nenhuma substituição de classe verdadeira.

Não tenho certeza do C#, mas acho que você pode emitir código no tempo de execução e criar uma nova classe dinamicamente, para que você possa alcançar (3) e provavelmente (2).

A substituição da classe verdadeira é suportada apenas por linguagem dinâmica, por exemplo, Smalltalk, Ruby, acho que Python e alguns outros. Isso requer a transformação das instâncias da classe para corresponder à nova forma. Eles geralmente inicializam os novos campos para nil se a classe mudar.

Afaik, idiomas dinâmicos portados para a JVM fazem hackers extensos do carregador de classe para suportar a substituição da classe em tempo de execução. Para Jruby, veja Um primeiro gosto de invocar dinâmico Para obter mais ponteiros como eles fazem isso agora, o que é problemático e como o próximo invokedynamic pode ajudar.

Isso não é oferecido em idiomas tipados estaticamente devido à complicação com o Sistema de tipo. Se uma alteração de assinatura de método em uma classe, outras classes existentes já carregadas podem não ser necessárias com a nova assinatura do método que não é segura. No java, você pode alterar um método enquanto a assinatura for a mesma usando o Arquitetura de depurador da plataforma java.

Houve alguma tentativa de adicionar esse recurso ao Java e/ou idiomas estaticamente digitados:

  • Suporte de tempo de execução para classes de java dinâmicas seguras de tipo
  • Apoiando adaptação dinâmica imprevista do comportamento do aplicativo
  • Uma técnica para atualização dinâmica do software Java

Este artigo fornece uma visão geral dos problemas relacionados

  • Influência de sistemas de tipo em evolução dinâmica de software

Não tenho certeza exatamente se esse endereço é uma pergunta inicial, mas esses ponteiros podem ser interessantes para sua tese de qualquer maneira.

Outras dicas

O java Língua Não suporta a substituição de arquivos da classe. A JVM expõe o recurso através das classes que você mencionou. Portanto, todos idiomas que foram portados para a JVM pode aproveitar isso.

Erlang Suporta a troca de código a quente e, se você estiver procurando também estruturas teóricas que modelem as atualizações da classe dinâmica, pode dar uma olhada no Creol idioma (interpretado).

A biblioteca de tempo de execução do Objective-C suporta construção dinâmica e registro de classes, registro de métodos preguiçosos e "swizzling de método", pelo qual as implementações do método podem ser alternadas em tempo de execução. As versões anteriores suportadas "Swizzling de classe", pelas quais uma classe poderia ser substituída por outro em tempo de execução, mas agora o swizzling do método é usado. Aqui está o documento de referência.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top