首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Groovy】编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 )

文章目录 一、编译时元编程引入 二、声明需要编译时处理的类 三、分析 Groovy 类的 AST 语法树 一、编译时元编程引入 ---- 在之前的 " 【Groovy】MOP 元对象协议与元编程 " 系列博客中..., 都是围绕 MetaClass 的 " 运行时元编程 " , 其在运行时才进行相关的元编程操作 , 如方法注入 , 方法委托等 ; 在编译时也可以进行元编程操作 ; 在 Java 和 Android...中 , 可以使用 注解处理器 AbstractProcessor 实现 APT 编译时技术 , 参考 【Android APT】 专栏 ; 在 Groovy 中实现的编译时技术 , 类似于 Java...中的编译时技术 ; 二、声明需要编译时处理的类 ---- 声明一个 Student 类 , 在其中定义成员变量和成员方法 ; 之后需要在编译时处理该类 ; class Student{ def...name def hello(){ println "hello" } } 三、分析 Groovy 类的 AST 语法树 ---- 参考 【Groovy】Groovy 环境搭建

52940
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    在 MSBuild 编译项目时阻止输出所有的警告信息

    ---- 在使用 msbuild 命令编译项目的时候,如果存在大量的警告,输出量会非常多。...如果我们使用 msbuild 命令编译来定位项目的编译错误,那么这些警告将会导致我们准确查找错误的效率明显降低。 当然,这种问题的首选解决方案是 —— 真的修复掉这些警告!!!...那么可以用什么方式临时关闭 msbuild 命令编译时的警告呢?...可以输入如下命令: msbuild /p:WarningLevel=0 这样在调试编译问题的时候,因警告而造成的大量输出信息就会少很多。...2 显示 1 级的警告以及某些不太严重的警告,例如有关隐藏类成员的警告。 3 显示级别 2 警告以及某些不太严重的警告,例如关于始终评估为 true 或 false 的表达式的警告。

    1.4K10

    Go 静态编译及在构建 docker 镜像时的应用

    Go 语言具有跨平台和可移植的特点,同时还支持交叉编译,可以在一个系统上编译出运行在另一个系统上的二进制可执行文件,这是因为 Go 在编译时支持将依赖的库文件与源代码一起编译链接到二进制文件中,所以在实际运行时不再需要依赖运行环境中的库...比如,使用 C 标准库和数学库中函数的程序可以用如下的命令行来编译和链接: 而在链接时,链接器只会复制被用到的目标模块,而并不会复制整个库的内容,这就减少了可执行文件在磁盘和内存中的大小。...静态编译是在编译时就将依赖的静态链接库复制到可执行文件中,这样在应用程序运行起来后无需依赖外部的库,只需要单一的可执行文件即可运行,但缺点是应用程序体积相对较大,程序运行的越多重复占用的内存浪费越多。...如果在 Go 代码中包含 import "C" 并且开启 CGO,那么在 go build 编译时就会通过 CGO 来处理 C 代码,生成能够让 Go 调用 C 的桥接代码,然后交给 gcc 编译得到...第一阶段构建用来编译得到可执行文件,在第二阶段构建时可以将上一个阶段中产出的可执行文件 COPY 到当前构建的镜像中,从而实现与上述效果相同的减少镜像体积的目的。

    11610

    【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )

    文章目录 一、ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 二、完整代码示例及进行编译时处理的编译过程 1、Groovy 脚本 Groovy.groovy...语法树节点 , 该节点是 ModuleNode 类型的 , 在一个 Groovy 脚本中可以定义多个 Class 类 , 其对应的 Class 语法树节点封装在了 ModuleNode 类的 List...init> visitMethod main visitMethod run visitProperty name visitField name visitMethod hello 二、完整代码示例及进行编译时处理的编译过程...ASTTransformation 实现类的全类名 : MyASTTransformation 3、使用命令行进行编译时处理 首先 , 进入 Y:\002_WorkSpace\003_IDEA\Groovy_Demo2...\src\main\groovy 目录 , cd Y:\002_WorkSpace\003_IDEA\Groovy_Demo2\src\main\groovy 然后 , 编译 编译时处理类 MyASTTransformation.groovy

    89720

    在 Roslyn 分析语法树时添加条件编译符号的支持

    我们在代码中会写 #if DEBUG 或者 [Conditional("DEBUG")] 来使用已经定义好的条件编译符号。...而定义条件编译符号可以在代码中使用 #define WALTERLV 来实现,也可以通过在项目属性中设置条件编译符号(Conditional Compilation Symbols)来实现。...然而如果我们没有做任何特殊处理,那么使用 Roslyn 分析使用了条件编译符号的源码时,就会无法识别这些源码。...---- 如果你不知道条件编译符号是什么或者不知道怎么设置,请参见: .NET/C# 项目如何优雅地设置条件编译符号? 我们在使用 Roslyn 分析语法树时,会创建语法树的一个实例。...在传入此预处理符号的情况下,Roslyn 就可以识别此符号了: ?

    97110

    利用Inno Setup在VS编译时自动构建安装包

    作者:傲慢与偏见 原文标题:利用Inno Setup在VS编译时自动构建安装包 原文链接:https://www.cnblogs.com/chonglu/p/17566940.html 欢迎网友们投稿技术类文章...在VS中右键项目属性,更改项目输出路径,有多个项目则都改为同一个 2.6....修改刚才创建安装包时生成的脚本文件 主要是将绝对路径改为相对路径以及自动获取主程序文件版本等,避免其它同事/电脑编译时报错,可以参考下我的脚本 ; Script generated by the Inno...效果演示 每次需要发布新版本时,将解决方案切换为Release模式编译,F6 Build一下,安装包就自动生成出来了,这里只是抛砖引玉给个思路,可以多阅读下官方文档实现出更为完美的安装包。...Tips:为避免编写代码调试时编译速度过慢,最好还是要在生成后事件中加上Release模式的判断,当解决方案中有很多个项目时,或编译目录依赖文件过多的情况下,Inno Setup构建的会有点慢。

    65220

    【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中进行方法拦截 )

    文章目录 一、在 MyASTTransformation#visit 方法中进行方法拦截 二、完整代码示例及进行编译时处理的编译过程 1、Groovy 脚本 Groovy.groovy 2、ASTTransformation...接口实现 MyASTTransformation.groovy 3、配置 ASTTransformation 3、使用命令行进行编译时处理 一、在 MyASTTransformation#visit...方法中进行方法拦截 ---- 在上一篇博客 【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中找到要拦截的方法 ) 中 , 在MyASTTransformation...节点中执行 ; 该 MethodNode 节点对应 Student 类的 hello 方法 ; 根据 【Groovy】编译时元编程 ( 方法拦截时用到的 AST 语法树节点 MethodNode 节点...ASTTransformation 实现类的全类名 : MyASTTransformation 3、使用命令行进行编译时处理 首先 , 进入 D:\002_Project\012_Groovy\Groovy_Demo

    39220

    python2中为什么在进行类定义时最好

    _repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name'] Person类很明显能够看出区别...,不继承object对象,只拥有了doc , module 和 自己定义的name变量, 也就是说这个类的命名空间只有三个对象可以操作....Animal类继承了object对象,拥有了好多可操作对象,这些都是类中的高级特性。...对于不太了解python类的同学来说,这些高级特性基本上没用处,但是对于那些要着手写框架或者写大型项目的高手来说,这些特性就比较有用了,比如说tornado里面的异常捕获时就有用到class来定位类的名称...最后需要说清楚的一点, 本文是基于python 2.7.10版本,实际上在python 3 中已经默认就帮你加载了object了(即便你没有写上object)。

    1.2K20

    Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag

    反射reflection是程序对自身的检查、验证甚至代码修改功能。...反射可以通过它的Reify功能来实时自动构建生成静态的Scala实例如:类(class)、方法(method)、表达式(expression)等。...我们使用compile-time-reflection在编译程序时指导编译器修改编译中代码或者产生新的代码,用runtime-reflection来进行实例的类型匹配、验证等。...在v2.10之前,Scala没有自备的Reflection工具库,只能用Java Reflection库提供的部分功能来动态检验类型(class)或对象(object)及使用它们的字段(member access...主要目的可能是为了解决JVM在编译过程中的类型擦拭(type erasure)问题:在运算过程中可以从TypeTag[T]中获取T类型信息(通过typeTag[T]),最终实现类型T的对比验证等操作:

    1.4K100

    Scala Macros - 元编程 Metaprogramming with Def Macros

    Scala Macros的工作原理是在程序编译时按照编程人员的意旨对一段程序进行修改产生出一段新的程序。...具体过程是:当编译器在对程序进行类型验证(typecheck)时如果发现Macro标记就会将这个Macro的功能实现程序(implementation):一个语法树(AST, Abstract Syntax...Tree)结构拉过来在Macro的位置进行替代,然后从这个AST开始继续进行类型验证过程。...在使用quasiquotes时我们一般是在q括号中放入原始代码。在q括号内调用AST变量用$前缀(称为unquote)。对类型tpe的操作可以参考scala.reflect api。...对一个目标,包括类型、对象、方法等进行注释意思是在源代码编译时对它们进行拓展修改甚至完全替换。

    3.2K90

    Scala语言入门:初学者的基础语法指南

    Scala语言来源于Java,它以Java虚拟机(JVM)为运行环境,Scala源码 (.scala)会编译成.class文件。...由于这个函数被定义为 implicit,因此编译器会在需要时自动调用它。 在主程序中,我们将一个 Int 类型的值赋值给一个 String 类型的变量。...定义一个样例类非常简单,只需在类定义前加上case关键字即可。...例如,下面是一个简单的样例类定义: case class Person(var name: String, var age: Int) 创建样例类的实例时,不需要使用new关键字,直接使用类名即可。...在每个case语句中,我们使用模式守卫来进一步过滤匹配的数字。 例如,case n if n > 0 && n % 2 == 0 表示当 number 大于 0 且为偶数时执行该分支。

    34220

    【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中找到要拦截的方法 )

    文章目录 一、在 MyASTTransformation#visit 方法中找到要拦截的方法 1、获取 ClassNode 节点集合 2、查找指定的 ClassNode 节点 3、获取指定 ClassNode...节点下的 MethodNode 节点集合 4、查找指定的 MethodNode 节点 一、在 MyASTTransformation#visit 方法中找到要拦截的方法 ---- 在 ASTTransformation...接口实现类的 void visit(ASTNode[] nodes, SourceUnit source) 方法中 , 其中 ASTNode[] nodes 参数是 AST 语法树根节点数组 , 每个数组元素都是一个...; 这是在 ModuleNode 中的 ClassNode 类节点封装在了 List classes = new LinkedList(); 成员中 ; 2...、查找指定的 ClassNode 节点 使用 source.AST.classes.find { // 查找名称为 Student 的类

    30010

    Scala语言入门:初学者的基础语法指南

    Scala语言来源于Java,它以Java虚拟机(JVM)为运行环境,Scala源码 (.scala)会编译成.class文件。...由于这个函数被定义为 implicit,因此编译器会在需要时自动调用它。 在主程序中,我们将一个 Int 类型的值赋值给一个 String 类型的变量。...定义一个样例类非常简单,只需在类定义前加上case关键字即可。...例如,下面是一个简单的样例类定义: case class Person(var name: String, var age: Int) 创建样例类的实例时,不需要使用new关键字,直接使用类名即可。...在每个case语句中,我们使用模式守卫来进一步过滤匹配的数字。 例如,case n if n > 0 && n % 2 == 0 表示当 number 大于 0 且为偶数时执行该分支。

    36120
    领券