这篇文章英文的原文在:做毕业设计报告时,老师要求必须翻译一篇外文,于是很认真的翻译了一下,也算是为开源做一点小贡献。翻译如下:
Javac黑客指南
David Erni and Adrian Kuhn
University of Bern, March 2008
0. 摘要:
这篇文章是介绍修改java编译器的。其中包含对Java编译器的介绍,以及两个例子的实现:一个简单的hello world 和一个重写AST(抽象语法树)的插件。
1. 介绍
随着Java 6的发布,java编译器已经有了开源的版本了。开源的编译器是OpenJDK项目的一部分,可以从Java编译器小组的网站下载 . 这个更新需要Mac OS X 10.5.2或者是更新的,而且要64位基于Intel的Mac。这个更新不会替换已经存在的J2SE 5.0安装,或者是改变Java的默认版本。
B ForceAssertions.java的全部源代码
importjava.util.Set; importjavax.annotation.processing.AbstractProcessor; importjavax.annotation.processing.ProcessingEnvironment; importjavax.annotation.processing.RoundEnvironment; importjavax.annotation.processing.SupportedAnnotationTypes; importjavax.annotation.processing.SupportedSourceVersion; importjavax.lang.model.SourceVersion; importjavax.lang.model.element.Element; importjavax.lang.model.element.ElementKind; importjavax.lang.model.element.TypeElement; importjavax.tools.Diagnostic; importcom.sun.source.util.Trees; importcom.sun.tools.javac.processing.JavacProcessingEnvironment; importcom.sun.tools.javac.tree.JCTree; importcom.sun.tools.javac.tree.TreeMaker; importcom.sun.tools.javac.tree.TreeTranslator; importcom.sun.tools.javac.tree.JCTree.JCAssert; importcom.sun.tools.javac.tree.JCTree.JCExpression; importcom.sun.tools.javac.tree.JCTree.JCStatement; importcom.sun.tools.javac.util.Context; importcom.sun.tools.javac.util.List; importcom.sun.tools.javac.util.Name; @SupportedAnnotationTypes("*") @SupportedSourceVersion(SourceVersion.RELEASE_6) publicclassForceAssertionsextendsAbstractProcessor{ privateinttally; privateTreestrees; privateTreeMakermake; privateName.Tablenames; @Override publicsynchronizedvoidinit(ProcessingEnvironmentenv){ super.init(env); trees=Trees.instance(env); Contextcontext=((JavacProcessingEnvironment) env).getContext(); make=TreeMaker.instance(context); names=Name.Table.instance(context); tally=0; } @Override publicbooleanprocess(Set<?extendsTypeElement>annotations, RoundEnvironmentroundEnv){ if(!roundEnv.processingOver()){ Set<?extendsElement>elements= roundEnv.getRootElements(); for(Elementeach:elements){ if(each.getKind()==ElementKind.CLASS){ JCTreetree=(JCTree)trees.getTree(each); TreeTranslatorvisitor=newInliner(); tree.accept(visitor); } } }else processingEnv.getMessager().printMessage( Diagnostic.Kind.NOTE,tally+"assertions inlined."); returnfalse; } privateclassInlinerextendsTreeTranslator{ @Override publicvoidvisitAssert(JCAsserttree){ super.visitAssert(tree); JCStatementnewNode=makeIfThrowException(tree); result=newNode; tally++; } privateJCStatementmakeIfThrowException(JCAssertnode){ //make:if(!(condition)thrownewAssertionError(detail); List<JCExpression>args=node.getDetail()==null ?List.<JCExpression>nil() :List.of(node.detail); JCExpressionexpr=make.NewClass( null, null, make.Ident(names.fromString("AssertionError")), args, null); returnmake.If( make.Unary(JCTree.NOT,node.cond), make.Throw(expr), null); } } }
译文连接:
还要高声歌唱。那歌声,一定是响遏流云的,