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

【Groovy】Groovy 扩展方法 ( 静态扩展方法配置 | 扩展方法示例 | 编译静态扩展 | 打包静态扩展字节码到 jar 包 | 测试使用 Thread 静态扩展 )

文章目录 一、扩展方法示例 二、静态扩展方法配置 三、编译静态扩展 四、打包静态扩展字节码到 jar 包 五、测试使用 Thread 静态扩展 一、扩展方法示例 ---- 为 Thread 扩展..., extensionClasses 用于配置 实例扩展方法 ; 这里配置是 静态扩展方法 ; 配置完成后项目结构如下 : 三、编译静态扩展 ---- Terminal 面板 , 执行...源码到 classes 目录 ; 其中 ThreadExt.groovy 定义了 Thread 扩展方法 ; 编译过程及结果如下 : 四、打包静态扩展字节码到 jar 包 ---- ...命令 , 将 classes 字节码文件按照 manifest/ 规则 , 打包到 thread.jar 文件 ; 五、测试使用 Thread 静态扩展 ---- 创建一个 Groovy 脚本..., 执行为 Thread 扩展静态方法 hello 方法 ; Thread.hello{ printf "Hello" } Terminal 面临 , 使用命令行执行该 Groovy

1K20

【Groovy】Groovy 扩展方法 ( 实例扩展方法配置 | 扩展方法示例 | 编译实例扩展 | 打包实例扩展字节码到 jar 包 | 测试使用 Thread 实例扩展方法 )

文章目录 一、扩展方法示例 二、实例扩展方法配置 三、编译实例扩展 四、打包静态扩展字节码到 jar 包 五、测试使用 Thread 实例扩展方法 一、扩展方法示例 ---- 为 Thread 扩展..., extensionClasses 用于配置 实例扩展方法 ; 这里配置是 实例扩展方法 ; 配置完成后项目结构如下 : 三、编译实例扩展 ---- Terminal 面板 , 执行...源码到 classes 目录 ; 其中 ThreadExt.groovy 定义了 Thread 扩展方法 ; 编译过程及结果如下 : 四、打包静态扩展字节码到 jar 包 ---- ...命令 , 将 classes 字节码文件按照 manifest/ 规则 , 打包到 thread.jar 文件 ; 五、测试使用 Thread 实例扩展方法 ---- 创建一个 Groovy 脚本..., 执行为 Thread 扩展静态方法 hello 方法 ; new Thread().hello{ printf "Hello" } Terminal 面临 , 使用命令行执行该 Groovy

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

【Groovy】Groovy 扩展方法 ( Groovy 扩展方法引入 | 分析 Groovy Thread start 扩展方法 )

文章目录 一、Groovy 扩展方法引入 二、 分析 Groovy Thread start 扩展方法 一、Groovy 扩展方法引入 ---- Groovy 可以对 JDK 一些进行...方法扩展 , 这些 JDK 自带可以执行额外扩展方法 ; 之前博客 【Groovy】使用 Groovy 语言开发服务器 Server 和客户端 Client 套接字程序 ( 服务器客户端完整代码示例...| 运行服务器端与客户端效果及过程分析 ) , 使用了 Thread.start { } 用法 , 闭包执行就是线程 Thread run 方法内容 ; 二、 分析 Groovy Thread... start 扩展方法 ---- 分析该为 Thread 扩展 start 扩展方法 , 扩展方法定义了 DefaultGroovyStaticMethods ; 该 start 方法接收一个...start 方法参数是 闭包 类型 ; Thread start 扩展方法 源码 : /** * 这个定义了groovy环境普通JDK上出现所有新静态groovy方法

1.4K30

【Android Gradle 插件】Gradle 扩展属性 ② ( 定义根目录 build.gradle 扩展属性 | 使用 rootProject.扩展属性名访问 | 扩展属性示例 )

文章目录 一、定义根目录 build.gradle 扩展属性 二、扩展属性示例 Android Plugin DSL Reference 参考文档 : Android Studio 构建配置官方文档...build.gradle 扩展属性 ---- org.gradle.api.Project 配置 ( build.gradle 根配置 ) 文档 : https://docs.gradle.org.../current/javadoc/org/gradle/api/Project.html 如果将 ext 扩展属性放到 Android 工程根目录下 build.gradle 构建脚本 , 则所有的...Module 模块下 build.gradle 都可以获取到该扩展属性值 ; Module 下 build.gradle 可以使用 rootProject.扩展属性名 来访问定义根目录...build.gradle 定义扩展属性值 ; 二、扩展属性示例 ---- 根目录下 build.gradle 定义扩展属性 : // 定义扩展属性 , 其中变量对所有子项目可见 ext {

2.9K20

.NET那些所谓新语法之二:匿名、匿名方法扩展方法

实现效果如下图所示: ? 1.3 匿名共享   可以想象一下,如果我们代码定义了很多匿名,那么是不是编译器会为每一个匿名都生成一个泛型呢?...虽然,输出是I love C sharp,但它确实是符合方法定义,因为它会接受一个string类型参数,尽管方法没有使用到这个参数。 ?   ...抽象工厂模式,我们可以通过新增一个工厂不需要更改源代码就可以切换到新工厂。这里也是如此,不修改源码情况下,为某个增加新方法,也就实现了扩展。   ...所得是乃,原来我们一直对集合进行筛选Where()方法居然是扩展方法不是原生。 ?   ...(3)如果要扩展本来就有和扩展方法名称一样方法,到底会调用成员方法还是扩展方法呢?

72030

Effective Java(第三版)——条目十六:公共使用访问方法不是公共属性

坚持面向对象程序员觉得这样是厌恶,应该被具有私有属性和公共访问方法(getter)所取代,而对于可变来说,它们应该被替换为setter设值方法: // Encapsulation of data...定义和使用客户端代码,这种方法比访问方法产生更少视觉混乱。 虽然客户端代码绑定到内部表示,但是这些代码仅限于包含该类包。...如果类内部表示是可取,可以不触碰包外任何代码情况下进行更改。 私有内部类情况下,更改作用范围进一步限制封闭。 Java平台几个违反了公共不应直接暴露属性建议。...着名例子包括java.awt包Point和Dimension。 这些类别应该被视为警示性示例,不是模仿例子。...---- 今天小程序更新题库: 1.为什么不建议代码中直接使用Executors创建线程池,而是推荐通过 ThreadPoolExecutor 方式创建 2.你对线程优先级理解是什么?

81910

startActivityForResult被标记为弃用后,如何优雅启动Activity?

,今天尽量用一篇简短文章简述下registerForActivityResult使用方法。...可以明显看到,androidx.activity1.2.0-alpha04时开始,Android这位你调用过无数次startActivityForResult和onActivityResult,...刚才例子,其实已经简单使用到Android提供一个默认协定ActivityResultContracts.StartActivityForResult()来启动了一个Activity并获得想要返回值...四、总结 Activity Result API和更优雅使用startActivityForResult现在想必你都已经会使用了,是不是比你想象更简单?...如果有需要,我会再写一篇使用较少单独接收 Activity 结果和Activity Result API源码解析。技术有限,若文中有错误遗漏之处,尽情谅解,也欢迎指正共同进步。

2K20

当Activity跳转偶遇单身多年老汉

项目中,Activity多重跳转一直是开发中最常见问题,网上解决方案很多,但是要怎么解决才是最佳往往才是头疼问题,我现在要讲的是如何真正解决这个问题不留一丝Bug,先介绍几种已有的方案以及优缺点...从这里看到 startActivityForResult 两个方法,参数短方法还是调用了参数长方法,这里我们只需要重写那个参数长方法即可,那我们不能用刚刚那种方式了,把 startActivity...这样直接写死 BaseActivity 是不是不利于扩展?...,一劳永逸,开发成本极低 缺点:不能精准判断跳转 Activity 是否是重复,也就是说如果同时跳转两个不同 Activity,结果只有第一个成功跳转,第二个却没有跳转 startActivityForResult...> cls) 隐式意图启动 构造方法:new Intent(String action) 对象方法:intent.setAction(String action) 这里已经列出这两种启动方式使用了,我们可以利用显式意图和隐式意图来分别创建一个

39620

关于使用MethodHandle子类调用祖父重写方法探究

关于使用MethodHandle子类调用祖父重写方法探究 注:这个例子原本出现在周志明先生《深入理解Java虚拟机》--虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里基于Java代码层面解释一下...这里直接看Sonthinking方法(关于为何这样实现,《深入理解Java虚拟机》读书笔记(七)--虚拟机字节码执行引擎(下)也解释了)。...普通方法调用,这个this参数是虚拟机自动处理,表示是当前实例对象,我们方法可以直接使用。...我觉得使用bindTo绑定方法接收者要比invoke方法传递更加友好,也更加符合程序员大众理解,invoke可以只专注方法显式入参。 然后再来说bindTo(this)this。...基于这个事实,我们这时可以直接在GrandFatherthinking方法调用Son独有的方法使用反射或者直接类型强制转换为Son就行了。

9.4K30

是时候丢掉 onActivityResult 了 !

回到 MainActivity ,按照传统写法,是这样: class MainActivity : AppCompatActivity(R.layout.activity_main) {...接收回调,并判断 requestCode,resultCode 上面的逻辑不乏重复样板代码,且大多都耦合在视图控制器(Activity/Fragment),也就造成了不易测试。...上面的例子,prepare() 方法传入协议实现StartActivityForResult 。它是 ActivityResultContracts 静态内部类。...说好解耦呢 ? 有时候我们可能会在结果回调中进行一些复杂处理操作,无论是之前 onActivityResult() 还是上面的写法,都是直接耦合在视图控制器。...通过新 Activity Result API,我们还可以单独处理结果回调,真正做到 单一职责 。

69920

项目文件 MSBuild NuGet 包编写扩展编译时候,正确使用 props 文件和 targets 文件

.NET 扩展编译用文件有 .props 文件和 .targets 文件。不给我选择还好,给了我选择之后我应该使用哪个文件来编写扩展编译代码呢?...工具包 - walterlv 如何创建一个基于命令行工具跨平台 NuGet 工具包 - walterlv 当我们创建 NuGet 包包含 .props 和 .targets 文件时候,我们相当于项目文件....targets 里就一目了然了: 如果你是定义属性或者为属性设置初值,那么请写到 .props 里面 这样,所有的 NuGet 包或者扩展编译流程都将可以访问到你设置属性值 如果你是使用属性,...-- 当生成 WPF 临时项目时,不会自动 Import NuGet props 和 targets 文件,这使得临时项目中你现在看到整个文件都不会参与编译。...:从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目) 下面的属性适合写到 .targets 里面,因为这里使用到了其他属性: 1

19920

Activity Result API详解,是时候放弃startActivityForResult了「建议收藏」

既然有更好API,那么就不再建议去使用过去老旧API,所以才把startActivityForResult()方法标为了废弃。...registerForActivityResult()方法接收两个参数,第一个参数是一种Contract类型,由于我们是希望从另外一个Activity请求数据,因此这里使用StartActivityForResult...然后createIntent()方法,我们手动创建了一个Intent,并将它用途设置为打开SecondActivity。...最后parseResult()方法,我们对SecondActivity返回结果进行解析,并将解析出来字符串作为输出参数返回。...这是以前使用startActivityForResult()方法传统写法。 Activity Result API是没有地方让你传入requestCode

74730

Activity Result API详解,是时候放弃startActivityForResult

既然有更好API,那么就不再建议去使用过去老旧API,所以才把startActivityForResult()方法标为了废弃。...然后createIntent()方法,我们手动创建了一个Intent,并将它用途设置为打开SecondActivity。...最后parseResult()方法,我们对SecondActivity返回结果进行解析,并将解析出来字符串作为输出参数返回。...这样一个自定义Contract就完成了,而我们使用这个Contract再去实现最开始两个Activity之间交换数据功能,就会变得更加简单: class FirstActivity : AppCompatActivity...这是以前使用startActivityForResult()方法传统写法。 Activity Result API是没有地方让你传入requestCode

1.6K30

用户界面开发基础

onCreate方法使用setContentView装载View。 实际上一个只要继承Activity就可以当成一个Activity来使用了,只是没有任何控件,只有屏幕顶端默认标题栏。...如果在中大量使用静态变量(尤其是很占用资源变量,如Bitmap对象)可能会造成内存溢出异常,而且可能因为静态变量很多中出现造成代码难以维护和混乱。...当然如果数据不复杂,也可以采用静态变量方式 至于剪切板,如果不是特殊情况,并不建议使用,因为这可能会影响到其他程序(其他程序也可能使用剪切板) ---- 返回数据到前一个Activity 应用程序...这样Activity中就不用创建按钮对象处理按钮单击事件了。 如果在程序只处理单击事件,不直接引用相应对象,可以采用这种方法。...(View Container) 视图 (例如TextView…) 使用xml布局文件定义视图 注意事项: XML布局文件扩展名必须是xml XML布局文件名必须符合Java变量命名规则(以为R

1.8K20

再见!onActivityResult!你好,Activity Results API!

背景 Android应用程序开发,启动一个Activity不一定是单项操作,从启动Activity获取数据是常见场景,最传统方式是通过Intent携带数据,然后使用startActivityForResult...随着应用扩展,onActivityResult回调方法各种嵌套、耦合严重、难以维护。 最常见场景就是调用系统相机相册获取照片了。...( Kotlin 使用 Void?...Google肯定考虑到了这个问题,于是,Google 预定义了很多Contract,把你们能想到使用场景基本上都想到了,它们都定义ActivityResultContracts,有以下这些Contract...非Activity/Fragment接收Activity结果 Activity和Fragment,我们能直接使用registerForActivityResultAPI ,那是因为ConponentActivity

1.7K20

再见!onActivityResult!你好,Activity Results API!

背景 Android应用程序开发,启动一个Activity不一定是单项操作,从启动Activity获取数据是常见场景,最传统方式是通过Intent携带数据,然后使用startActivityForResult...随着应用扩展,onActivityResult回调方法各种嵌套、耦合严重、难以维护。 最常见场景就是调用系统相机相册获取照片了。...( Kotlin 使用 Void?...Google肯定考虑到了这个问题,于是,Google 预定义了很多Contract,把你们能想到使用场景基本上都想到了,它们都定义ActivityResultContracts,有以下这些Contract...非Activity/Fragment接收Activity结果 Activity和Fragment,我们能直接使用registerForActivityResultAPI ,那是因为ConponentActivity

1.5K40
领券