Pergunta

Eu sou um fã de estático metaprogramming em C ++ . Eu sei que Java tem agora genéricos. Quer isto dizer que metaprogramação estática (ou seja, em tempo de compilação a execução do programa) é possível em Java? Se assim for, alguém pode recomendar qualquer bons recursos onde se pode aprender mais sobre ele?

Foi útil?

Solução

Não, isso não é possível. Genéricos não são tão poderosos como modelos. Por exemplo, um argumento de modelo pode ser um tipo definido pelo utilizador, um tipo primitivo, ou um valor; mas um argumento modelo genérico só pode ser Object ou um subtipo do mesmo.

Edit: Esta é uma resposta de idade; desde 2011 temos Java 7, que tem Anotações que podem ser usados ??para este tipo de trapaça .

Outras dicas

Dê uma olhada Clojure . É um LISP com Macros (meta-programação) que é executado na JVM e é muito interoperável com Java.

O que você exatamente quer dizer com "metaprogramação estática"? Sim, C ++ modelo metaprogramming é impossível em Java, mas oferece outros métodos, muito mais poderosos do que os de C ++:

  • reflexão
  • programação orientada a aspectos (@AspectJ)
  • manipulação de bytecode (Javassist, ObjectWeb ASM, agentes de Java)
  • geração de código (Ferramenta de processamento de anotação, modelo de motores como Velocity)
  • manipulações Abstract árvore de sintaxe (APIs fornecidas pelo IDEs populares)
  • possibilidade de executar compilador Java e usar o código compilado, mesmo em tempo de execução

Não há melhor método: cada um desses métodos tem seus pontos fortes e fracos. Devido à flexibilidade da JVM, todos esses métodos em Java pode ser usado tanto em tempo de compilação e tempo de execução.

No. Ainda mais, tipos genéricos são apagados ao seu limite superior pelo compilador, então você não pode criar uma nova instância de um tipo genérico T em tempo de execução.

A melhor maneira de fazer metaprogamming em Java é para contornar o apagamento tipo e mão no objeto Class<T> de seu tipo T. Ainda assim, este é apenas um hack.

Não, os genéricos em Java é puramente uma maneira de evitar vazamento de objeto.

Se você precisa poderosa lógica de tempo de compilação para Java, uma maneira de fazer isso é com algum tipo de geração de código. Dado que, como outros cartazes têm apontado, a linguagem Java não fornece qualquer apresenta adequado para fazer a lógica de tempo de compilação, esta pode ser sua melhor opção (sse você realmente tem uma necessidade de lógica em tempo de compilação). Depois de ter esgotado as outras possibilidades e você é certeza que você quer fazer de geração de código, você poderia estar interessado no meu projeto de código aberto Rjava, disponível em:

http://www.github.com/blak3mill3r

É uma biblioteca Java geração de código escrito em Ruby, que escrevi para gerar interfaces de Google Web Toolkit para aplicações Ruby on Rails automaticamente. Tem-se revelado bastante útil para isso.

Como um aviso, pode ser muito difícil para depurar código Rjava, Rjava não faz muito verificação, ele simplesmente assume que você sabe o que está fazendo. Isso é muito bonito o estado de metaprogramação estática de qualquer maneira. Eu diria que é significativamente mais fácil de depurar do que qualquer coisa não-trivial feito com C ++ TMP, e é possível usá-lo para os mesmos tipos de coisas.

De qualquer forma, se você estava pensando em escrever um programa que gera o código-fonte Java, pare agora mesmo e confira Rjava. Pode não fazer o que quiser ainda, mas do MIT licenciado, tão à vontade para melhorá-lo, frite-lo, ou vendê-lo para sua avó. Eu ficaria feliz em ter outros devs que são experientes com programação genérica para comentar sobre o design.

Lombok ofertas uma forma fraca de metaprogramming tempo de compilação. No entanto, a técnica que eles usam é completamente geral.

código Java transformar em tempo de compilação para uma discussão relacionada

Eu não tenho certeza eu entendo a vantagem de meta-programação estática.

Em Java, você pode refletir para encontrar informações sobre suas aulas e fazer todas as coisas meta-programação iria fazer, você só começa a fazer-los dentro de seu código sem adicionar nova sintaxe e diferentes formas de pensar. As anotações também são capazes de fazer determinadas tarefas meta-programação de uma forma mais estruturada.

Eu posso estar errado sobre isso, eu estou pensando seriamente em abrir uma pergunta sobre isso porque eu não tenho certeza eu entendo. Parece que meta-programação estática é um hack puro que fica em torno do fato de que alguns idiomas não manter um monte de informações em tempo de compilação disponível em tempo de execução (um dos pontos fortes de Java e de linguagens dinâmicas).

Se alguém pudesse responder com um link para um exemplo onde as ofertas meta-programação uma solução mais compreensível, legível ou de outra forma melhor do que a reflexão seria, eu aprecio o esforço.

ofertas O href="https://github.com/manifold-systems/manifold" rel="nofollow projeto Manifold tipo seguro estática metaprogramming para Java. Você pode usá-lo para construir tipos dinamicamente em tempo de compilação como javac resolve nomes de tipo. A JSON Schema demonstração demonstra metaprogramação estática em termos de dinâmica, o tipo de tempo de compilação de projeção (sem código etapas de geração de compilação).

Além disso, você pode usar Manifold para adicionar novos recursos. Confira estrutural Typing , Extensões método e href="http://manifold.systems/images/jailbreak.mp4" rel="nofollow noreferrer"> Tipo Reflexão -safe. .

scroll top