Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Complete metaprogramming framework for Java?

I'm interested in metaprogramming (i.e. programs that help programmers do tedious programming tasks). I'm looking for a tool which has the following properties:

  • usable both at compile time and runtime;
  • inspects program structure;
  • can add new classes, methods or fields and make them visible to Java compiler;
  • can change behavior of methods;
  • Java-based (well, Java is most popular programming language according to some rankings);
  • good integration with IDEs and build tools like Ant, Gradle or Maven;
  • actively maintained project;
  • easy to use and extend;

There are some solutions for this, like:

  • reflection
  • AspectJ
  • Annotation Processing Tool
  • bytecode manipulation (CGLIB, Javassist, java.lang.instrument)
  • Eclipse JDT
  • Project Lombok
  • Groovy, JRuby, Scala

But unfortunately none of them meets all the criteria above. Is there any complete metaprogramming solution for Java?

like image 587
iirekm Avatar asked Sep 12 '11 14:09

iirekm


2 Answers

There's JackPot, which is Java based but I don't think gets a lot a current attention. Has ASTs and symbol tables AFAIK. You can probably extend it; I doubt anybody will stop (or help) you.

There's the Java-based compiler APIs for the Sun, er, Oracle java compiler. They're likely actively maintained, but I don't think you can modify source code and regenerate it. Certainly has symbol tables; dunno about trees. Probably pretty hard to extend; you have to keep up with the compiler guys, not the other way round.

There is ANTLR, which has a Java implementation and a Java parser that will build ASTs. I don't think it has full symbol tables, so doing serious code analysis/revision is likely to be hard. ANTLR is certainly actively maintained, and nobody will object to you enhancing the Java grammar with symbol tables. Just know that will take you about 6 months for Java 1.6 if that's all you do. (That's how long it took our internal [smart] guy to do it for DMS, starting with symbol table support for 1.4).

Not in Java, and not easily integrated into IDEs, but capable of carrying massive analysis and transformation on Java code is our DMS Software Reengineering Toolkit with its Java Front End.

DMS is generic compiler machinery: parsing, AST building, symbol table machinery, flow analysis machinery, with that additional bonuses of source-to-source transformations and generic prettyprinting of ASTs back to legal text including retention of comments. It offers a set of APIs supporting these services, and additional tools for defining grammars and langauge-dependent flow analyzers.

The Java Front End gives crucial detail (using those APIs) to DMS to allow it process Java: a grammar/parser, full symbol table construction for Java 1.4-1.6 (with 1.7 due momentarily), as well as some control and data flow analysis (to be extended over time because this stuff is so useful).

By using the services provided by DMS and the Java Front end, one can reasonably contemplate building arbitrary Java anlaysis and transformation tools. (This makes the tool a "complete" metaprogramming tool, in that it can inspect any language structure, or change any language structure, as opposed to say template metaprogramming or reflection). We believe this to be much more effective than ad hoc tools because you don't have to build the infrastructure, the infrastructure provided is robust and handles cases you don't have the energy to implement, and it is designed to support such tasks. YMMV.

DMS/Java Front end have been used to construct a variety of Java tools: test coverage, profilers, dead code elimination, clone detection on scale, JavaDoc with hyperlinked source-code, fast XML parser/generators, etc.

Yes, its actively maintained; undergoing continuous enhancement since the first version in 1998.

like image 156
Ira Baxter Avatar answered Oct 20 '22 08:10

Ira Baxter


There's a Java metaprogramming framework that is part of Tapestry IOC, it's called Plastic. It munges class bytecodes using custom classloaders, I haven't tried it yet but it looks like it gives a simple interface that still enables the programmer to make powerful metaprogramming changes.

like image 29
Nathan Hughes Avatar answered Oct 20 '22 08:10

Nathan Hughes