• Java Program Transformation


    常见缩写

    • CtClass: compile-time class

    Spoon:

    Structural elements

    编程语言具有不同的meta model。
    一个抽象语法树(AST)或者模型,是meta model的一个实例。每一个meta model——以及相应的AST——都或多或少的取决于需要完成的工作。例如,javac的meta model是为了编译字节码而设计和优化的,而Eclipse IDE的java meta model是为了集成不同的软件开发需求(代码补全,快速修复编译错误,debug等)而设计的。
    不同于基于编译器的AST(比如javac),Spoon的meta model是为了让普通java开发者容易理解而设计的,为了帮助他们编写自己的代码分析和转换工具。Spoon包含生成可编译和可执行的java程序的所有信息。
    spoon meta model可以分为三部分:

    • structural part包含程序基本元素(program elements)的declarations。比如interface, class, variable, method, annotation, enum...
    • code part, executable java code, such as the one found in method bodies.
    • reference part, references to program elements
      所有element继承自CtElement, ct for compile-time CtModule element represent a module in java 9.

    Code elements

    Code elements包括CtStatement和CtExpression两种。
    CtStatement是无类型的top-level指令,可以直接在代码块中使用。
    CtExpression被用在Statement中。 examples: https://spoon.gforge.inria.fr/code_elements.html

    References

    meta model的reference part表达了这样一个事实:程序引用的elements不是必须要在meta model中有所对应(它们可能属于第三方库)。比如说,一个返回String的表达式节点被限制为对String的类型引用而不是对编译期的String.java的模型的类型引用,因为String的源代码(基本上)不是需要被分析的应用代码。
    换句话说,meta model的elements使用references,以弱引用的方式引用elements。弱引用使得创建和修改program model更加灵活,不需要必须获得所有引用到的elements的强引用。 References在模型创建时被解析,解析的引用指向通过spoon input path指向的源代码中的类。 因为是弱引用,所以引用的目标即使不存在也可以被引用。 这种低耦合的代价是,当一个人需要从一个element跳转到另一个element时,他需要先跳转到引用,然后再跳转到目标。比如,从一个field获取它的类型,需要使用field.getType().getDeclaration()

    Creating AST elements

    Create elements with factories

    当你通过processors和templates设计和实现transformations时,你需要创建新的element,赋值并把他们添加到Spoon构建的AST中。
    使用Factory创建element。Factory是Spoon所有factories的入口。

    • CoreFactory,: 可以创建meta model中的任何element。
    • CodeFactory: code element和Object
    • PackageFactory: package reference
    • TypeFactory: 通过fully qualified name 或者 .class的invocation来获取任何类型,已经创建任何类型的类型引用
    • ClassFactory: TypeFactory的子类,专用于Class
    • EnumFactory: TypeFactory的子类,专用于Enum
    • InterfaceFactory: TypeFactory的子类,专用于Interface
    • ExecutableFactory: 创建executable objects and their parameters
    • ContructorFactory: subclass of ExecutableFactory, specialized for CtConstructor
    • MethodFactory: subclass of ExecutableFactory, specialized for CtMethod
    • FieldFactory: 创建Field或者Field Reference
    • AnnotationFactory: 为element添加annotation或者创建一个新的。 所有的factories都是为了创建elements。

    Generating Spoon code for an element

    SpoonifierVisitor v = new SpoonifierVisitor(true); 
    Launcher.parseClass("class A { public String sayHello() { return \"Hello World!\";}}") 
    	.getMethodsByName("sayHello") 
    	.get(0) 
    	.accept(v); 
    System.out.println(v.getResult());
    

    Comments and position

    • CtComment.CommentType.FILE: 文件头部的注释,一般用于licence
    • CtComment.CommentType.INLINE: //
    • CtComment.CommentType.BLOCK: /* */
    • CtComment.CommentType.JAVADOC: /** */

    Source Positions

    SourcePosition定义了CtElement在源代码文件中的位置。

  • 相关阅读:
    java Random 随机重排
    java Random 带权重的随机选择
    java 枚举
    springboot docker 部署
    docker 国内镜像加速
    BigDecimal使用
    java继承实现的基本原理
    MySQL 数据类型
    Knockout: 让ViewModel从htm中剥离出去。
    常用代码之五:RequireJS, 一个Define需要且只能有一个返回值/对象,一个JS文件里只能放一个Define.
  • 原文地址:https://www.cnblogs.com/N3ptuner/p/15841057.html
Copyright © 2020-2023  润新知