Javac黑客指南(1)

  这篇文章英文的原文在:做毕业设计报告时,老师要求必须翻译一篇外文,于是很认真的翻译了一下,也算是为开源做一点小贡献。翻译如下:

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);   }   }   }

  译文连接:

还要高声歌唱。那歌声,一定是响遏流云的,

Javac黑客指南(1)

相关文章:

你感兴趣的文章:

标签云: