ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java Program Transformation

2022-01-24 22:04:13  阅读:210  来源: 互联网

标签:elements Java element meta 引用 Program java model 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在源代码文件中的位置。

标签:elements,Java,element,meta,引用,Program,java,model,Transformation
来源: https://www.cnblogs.com/N3ptuner/p/15841057.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有