概述:BodyDeclaration 和 VariableDeclaration
BodyDeclaration(体的声明)为啥叫体的声明,是因为它只描述体的特征,而不描述体里面的内容,体里面的内容由Statement以及其子类提供。所以最典型的一个BodyDeclaration的节点是没有“{}”这个的,每个BodyDeclaration都会告诉你,如果你没有子节点,那么你后面是不会接一对“{}”这个的
VariableDeclaration是针对变量进行声明,为啥这两个抽象类不合并为一个,没想明白。还有一个没有想明白的是FieldDeclaration继承的是BodyDeclaration。其实声明的结构都比较类似。
1.常用BodyDeclaration节点
TypeDeclaration:描述一个类型的声明,它又分为ClassDeclaration类的声明和InterfaceDeclaration接口的声明,
这两种声明是用一个属性来进行区分的isInterface。
ClassDeclaration:
[ Javadoc ] { Modifier } class Identifier
[ extends Type]
[ implements Type { , Type } ]
{ { ClassBodyDeclaration | ; } }
InterfaceDeclaration:
[ Javadoc ] { ExtendedModifier } interface Identifier
[ < TypeParameter { , TypeParameter } > ]
[ extends Type { , Type } ]
{ { InterfaceBodyDeclaration | ; } }
有一些比较混乱的ast把早期版本跟后期版本的一些方法放在一起,所以有时会不知道用那个方法。下面列出一个JLS3版的例子
//类名
TypeDeclaration classType = ast.newTypeDeclaration();
classType.setInterface(false);
//添加modifiers
classType.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
//添加类名
classType.setName(ast.newSimpleName("MyFirstApp"));
//添加父类
classType.setSuperclassType(ast.newSimpleType(ast.newSimpleName("ApplicationWindow")));
//添加实现的接口
classType.superInterfaceTypes().add(null);
//这个是接口才有的“<super,super>”
classType.typeParameters().add(null);
//加类体的声明
classType.bodyDeclarations().add(null);
unit.types().add(classType);
FieldDeclaration:字段声明的节点类型,一个字段声明包含一个Type 类型和多个VariableDeclarationFragment
属性声明片段,这个片段包含变量名和初始值。
FieldDeclaration:
[Javadoc] { ExtendedModifier } Type VariableDeclarationFragment
{ , VariableDeclarationFragment } ;
VariableDeclarationFragment vdf = ast.newVariableDeclarationFragment();
//属性名
vdf.setName(ast.newSimpleName("sss"));
//初始值
vdf.setInitializer(ast.newBooleanLiteral(true));
FieldDeclaration fieldDeclaration = ast.newFieldDeclaration(vdf);
fieldDeclaration.fragments().add(null);
fieldDeclaration.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
//属性类型
fieldDeclaration.setType(ast.newSimpleType(ast.newName("XXX")));
//这里有个问题就是顺序问题,属性如果加在后面会显示在方法的后面
classType.bodyDeclarations().add(fieldDeclaration);
Initializer:静态代码块
Initializer:
[ static ] Block
//静态代码块
Initializer initializer = ast.newInitializer();
//加modifiers
initializer.modifiers().add(null);
//加内容
initializer.setBody(null);
classType.bodyDeclarations().add(initializer);
MethodDeclaration:有两种,一种是常见的方法,一种是构造。方法的结构比较复杂,这里就不举例子了,跟上面的写法是类似的,只是要区分有些方法是有版本限制的。
MethodDeclaration:
[ Javadoc ] { ExtendedModifier }
[ < TypeParameter { , TypeParameter } > ]
( Type | void ) Identifier (
[ FormalParameter
{ , FormalParameter } ] ) {[ ] }
[ throws TypeName { , TypeName } ] ( Block | ; )
ConstructorDeclaration:
[ Javadoc ] { ExtendedModifier }
[ < TypeParameter { , TypeParameter } > ]
Identifier (
[ FormalParameter
{ , FormalParameter } ] )
[throws TypeName { , TypeName } ] Block
EnumDeclaration:枚举的声明节点,这个我暂时用不到,这里只是发出它的结构出来
EnumDeclaration:
[ Javadoc ] { ExtendedModifier } enum Identifier
[ implements Type { , Type } ]
{
[ EnumConstantDeclaration { , EnumConstantDeclaration } ] [ , ]
[ ; { ClassBodyDeclaration | ; } ]
}
2.继承VariableDeclaration的节点:SingleVariableDeclaration和VariableDeclarationFragment
SingleVariableDeclaration:有ExtendedModifier 和Type 的声明
SingleVariableDeclaration:
{ ExtendedModifier } Type [ ... ] Identifier { [] } [ = Expression ]
VariableDeclarationFragment:“{ [] }”数组用的, [ = Expression ]
VariableDeclarationFragment:
Identifier { [] } [ = Expression ]
// Composite container = new Composite(parent, SWT.NONE);
VariableDeclarationFragment variableFragment = ast.newVariableDeclarationFragment();
variableFragment.setName(ast.newSimpleName("container"));
VariableDeclarationStatement variableStatement = ast.newVariableDeclarationStatement(variableFragment);
variableStatement.setType(ast.newSimpleType(ast.newSimpleName("Composite")));
ClassInstanceCreation classCreation = ast.newClassInstanceCreation();
classCreation.setType(ast.newSimpleType(ast.newSimpleName("Composite")));
variableFragment.setInitializer(classCreation);
methodBlock.statements().add(variableStatement);
classCreation.arguments().add(ast.newSimpleName("parent"));
classCreation.arguments().add(ast.newName(getSimpleNames("SWT.NONE")));
需要注意的是VariableDeclaration一般都是用在Statement里面的
分享到:
相关推荐
微信小程序Artandw_eapp-artand
本项目是一款基于Vue和JavaScript开发的心旅途个性化推荐旅游平台设计源码,整合了513个Java文件、76个PNG图片、70个XML配置文件、62个JavaScript文件、42个Vue组件文件、28个CSS样式文件、22个HTML文件、18个YAML配置文件、16个属性文件、11个Vue模板文件,总计919个文件。平台采用现代化前端技术堆栈,旨在为用户提供个性化的旅游推荐服务。
微信小程序开发地图演示、地图导航、标记标注_echat-weapp-mpdemo
Vue和Axios文件
该项目为基于Python语言开发的HTML与任务清单关系系统,包含50个文件,其中16个为HTML文件,14个为Python源代码文件,其余包括Python编译文件、Markdown文件、图片、数据库文件、配置文件、模板文件、文本文件等,旨在为用户提供简单便捷的生活时间段安排及任务规划管理工具。
全国大学生电子设计大赛项目合集全国电赛优秀作品大学生电子竞赛历届题目
该项目是一款基于Python和pygame引擎开发的植物大战僵尸游戏,包含125个文件,涵盖93个PNG图像文件、11个Python源代码文件、10个Python字节码文件、8个GIF动画文件、1个Git忽略配置文件、1个JSON数据文件以及1个Markdown说明文件。游戏设计源码为学习游戏开发提供了丰富的实践素材。
本项目是一款以Java为核心开发的Qiniu服务端设计源码整合的RunFlow桌面端效率工具,总文件数29个,包括17个Java源文件、2个属性文件、1个Git忽略文件、1个JAR包文件、1个LICENSE文件、1个Markdown文件、1个YAML文件、1个Maven配置文件和1个命令文件。该工具旨在提升工作效率,适用于各种桌面环境下的便捷使用。
那些年,与你同分同位次的同学都去了哪里?全国各大学在辽宁2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
Golang支付-微信公众号、微信应用、微信小程序、微信企业支付、支付宝网络版、支付宝应用、支付宝企业支付_支付宝
医疗辅助诊断系统-开题
该项目为东东购物网的后台开发源码,采用JavaScript为主要编程语言,辅以CSS、Java、HTML等多种语言,共包含1300个文件。具体文件类型分布如下:458个PNG图片文件、215个JavaScript文件、160个JPG图片文件、159个GIF图片文件、107个CSS样式表文件、96个Java源代码文件、28个HTML文件、24个XML文件、12个JSON文件、8个Map文件。该系统旨在提供高效、便捷的购物后台管理功能。
content_1728052071778.apk
资源视频编辑软件win781064位系统
职业心理测试人格气质情绪控制测试18个文件
那些年,与你同分同位次的同学都去了哪里?全国各大学在辽宁2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
该项目为基于Python语言的微信小程序源码,全面整合了JavaScript和微信小程序开发技术。项目结构包含50个文件,涵盖了15个PNG图片、9个JSON配置、8个JavaScript脚本、7个wxss样式表、6个WXML模板和4个JPG图片。此外,还包括1个Markdown文档。该小程序的设计与实现展现了Python编程的强大能力,适用于微信生态下的各类应用场景。
全国大学生电子设计大赛项目合集全国电赛优秀作品电赛B题风力摆控制系统设计(原理图+源代码+设计报告等)
基于西门子S7-200PLC的自动灌溉系统组态王组态 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面
该项目是基于GitHub平台的xClouds-device项目设计源码,包含2835个文件,包括763个头文件、630个C语言源文件、207个文本文件、144个Makefile文件、102个Python脚本、86个Markdown文件、70个二进制文件、59个实验文件、50个Shell脚本、48个项目构建脚本。该项目主要使用C语言编写,辅以Python、Shell、C++和C++等语言,适合进行设备控制和云平台交互开发。