Frage

Ich bin ein Fan von statischer Metaprogrammierung in C ++ . Ich weiß, Java jetzt hat Generika. Bedeutet dies, dass die statische metaprogramming (das heißt Kompilierung-Programmausführung) ist möglich in Java? Wenn ja, kann keine gute Ressourcen jeder empfehlen, wo kann man mehr darüber erfahren?

War es hilfreich?

Lösung

Nein, das ist nicht möglich. Generika sind nicht so mächtig wie Vorlagen. Zum Beispiel kann eine Schablone Argument ein benutzerdefinierter Typ, ein primitiver Typ oder ein Wert sein; aber ein generisches Template-Argument kann nur davon Object oder ein Subtyp werden.

Edit: Dies ist eine alte Antwort; seit 2011 haben wir Java 7, die Anmerkungen hat, die für solche Tricks verwendet werden können.

Andere Tipps

Hier finden Sie aktuelle Clojure . Es ist ein LISP mit Makros (Meta-Programmierung), die auf der JVM läuft und ist sehr kompatibel mit Java.

Was meinst du genau mit „static metaprogramming“? Ja, C ++ Metaprogrammierung ist unmöglich, in Java, aber es andere Methoden bietet, viel mächtiger als die von C ++:

  • Reflexion
  • aspektorientierte Programmierung (@AspectJ)
  • Bytecode-Manipulation (Javassist, ObjectWeb ASM, Java-Agenten)
  • Code-Generierung (Annotation Verarbeitungswerkzeug, Template-Engines wie Geschwindigkeit)
  • Abstract Syntax-Baum-Manipulationen (APIs von beliebten IDEs zur Verfügung gestellt)
  • Möglichkeit Java-Compiler zu laufen und kompilierten Code auch zur Laufzeit

Es gibt keine beste Methode: Jede dieser Methoden hat ihre Stärken und Schwächen. Aufgrund der Flexibilität der JVM, können alle diese Methoden in Java sowohl bei der Kompilierung und zur Laufzeit verwendet werden.

Nein. Sogar noch mehr, sind generische Typen gelöscht, um ihre oberen durch den Compiler gebunden, so dass Sie nicht eine neue Instanz eines generischen Typ T zur Laufzeit erstellen.

Der beste Weg, metaprogamming in Java zu tun, ist die Art Löschung und Hand im Class<T> Objekt Ihrer Art T. noch zu umgehen, ist dies nur ein Hack.

Nein, Generika in Java ist eine reine Art und Weise Gießen von Objekt zu vermeiden.

Wenn Sie für Java leistungsstarke Kompilierung-Logik müssen, besteht eine Möglichkeit, das zu tun ist mit irgendeiner Art von Code-Generierung. Da, wie andere Plakate haben darauf hingewiesen, wird die Sprache Java keine Funktionen bieten geeignet dafür Kompilierung-Logik kann dies die beste Option sein (iff Sie wirklich eine Notwendigkeit zu tun haben für Kompilierung-Logik). Sobald Sie die anderen Möglichkeiten ausgeschöpft haben und Sie sicher mögen Sie Code-Generation tun, könnten Sie bei meinem Open-Source-Projekt Rjava, verfügbar interessieren:

http://www.github.com/blak3mill3r

Es ist eine Java-Codegenerierung Bibliothek in Ruby geschrieben, die ich um schrieb Google Web Toolkit-Schnittstellen für Ruby on Rails-Anwendungen automatisch zu generieren. Es hat sich als sehr nützlich für das.

Als Warnung, kann es sehr schwierig sein, Rjava Code zu debuggen, wird Rjava nicht viel Kontrolle tun, nimmt nur wissen, was du tust. Das ist so ziemlich der Zustand des statischen metaprogramming sowieso. Ich würde sagen, es ist wesentlich einfacher zu debuggen als alles, was nicht-trivial abgetan C ++ TMP, und es ist möglich, sie für die gleichen Arten von Dingen zu verwenden.

Wie auch immer, wenn Sie erwägen, wurden ein Programm zu schreiben, die Java-Quellcode ausgibt, jetzt stoppen und Rjava überprüfen. Es ist vielleicht nicht das tun, was Sie noch wollen, aber es ist MIT lizenziert, so fühlen sich frei, um es zu verbessern, frittieren sie, oder verkaufen sie an Ihre Großmutter. Ich würde mich freuen, andere Entwickler zu haben, die mit generischer Programmierung auf der Gestaltung Kommentar erlebt werden.

Lombok eine schwache Form der Kompilierung metaprogramming bietet. Allerdings ist die Technik, die sie benutzen ganz allgemein .

Siehe Java-Code bei der Kompilierung verwandelt für eine verwandte Diskussion

Ich bin mir nicht sicher, ob ich den Vorteil der statischen Meta-Programmierung zu verstehen.

In Java können Sie reflektieren Informationen über Ihre Klassen zu finden, und all die Dinge tun Meta-Programmierung tun würde, die Sie gerade sie in Ihrem Code zu tun bekommen, ohne das Hinzufügen neue Syntax und unterschiedliche Denkweisen. Anmerkungen sind auch in der Lage bestimmte Meta-Programmieraufgaben in einer strukturierten Art und Weise zu tun.

könnte ich das falsch sein, ich bin ernsthaft erwägen eine Frage an sie zu öffnen, weil ich nicht sicher bin ich es. Es scheint, wie statische Meta-Programmierung eine saubere Hack ist, die sich um die Tatsache erhält, dass einige Sprachen halten nicht viel von Kompilierung-Informationen zur Laufzeit (eine der Stärken von Java und dynamischer Sprache).

Wenn jemand mit einem Link zu einem Beispiel antworten kann, wo Meta-Programmierung bietet eine verständliche, lesbare oder anderweitig bessere Lösung als Reflexion würde ich den Aufwand schätzen würde.

Die Manifold Projekt typsichere bietet statisch metaprogramming für Java. Sie können es verwenden Typen dynamisch zur Compile-Zeit zu bauen, wie Javac Typnamen auflöst. Die JSON Schema Demo zeigt statische metaprogramming in Bezug auf dynamische, Kompilierung-Typ Projektion (kein Code Generation bauen Stufen).

Zusätzlich können Sie Verteiler verwenden, um neue Funktionen hinzuzufügen. Schauen Sie sich Struktur Typing , Methode Extensions und Typ -safe Reflexion . .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top