eclipse扩展点_Eclipse扩展点评估变得容易

eclipse扩展点

编码Eclipse扩展点评估有点冗长,而且很少能自我解释。 当我最近忙于自己忙于这个话题时,我写了一个小助手,目的是减少通用编程步骤的样板代码,同时增加开发指导和可读性。

它原来是不容易找到一个表现的解决方案,其中所有的使用情况下,我可以从目前的项目中提取匹配。 因此,我认为分享我的发现并看看其他人对此有何想法是一个好主意。

Eclipse扩展点评估

考虑一个简单的扩展点定义,该定义支持扩展的无限贡献。 这些贡献中的每一个都应该提供Runnable实现来执行某种操作:

扩展点定义

通常的评估任务是检索所有贡献,创建可执行扩展并调用以下每个扩展

public class ContributionEvaluation {private static final String EP_ID= "com.codeaffine.post.contribution";public void evaluate() {IExtensionRegistry registry = Platform.getExtensionRegistry();IConfigurationElement[] elements= registry.getConfigurationElementsFor( EP_ID );Collection<Runnable> contributions = new ArrayList<Runnable>();for( IConfigurationElement element : elements ) {Object extension;try {extension = element.createExecutableExtension( "class" );} catch( CoreException e ) {throw new RuntimeException( e );}contributions.add( ( Runnable )extension );}for( Runnable runnable : contributions ) {runnable.run();}}
}

尽管可以将evaluate分为较小的方法来阐明其职责,但该类也将填充更多的粘合代码。 当我发现这些部分很难阅读且难以编写时,我正在思考一种流畅的界面方法,该方法应指导开发人员完成各个实现步骤。

结合Java 8 lambda表达式,我能够创建一个辅助工具,将evaluate功能归结为:

public void evaluate() {new RegistryAdapter().createExecutableExtensions( EP_ID, Runnable.class ).withConfiguration( ( runnable, extension ) -> runnable.run() ).process();
}

诚然,我作弊了一点,因为通过使用java 8 Collection#forEach功能而不是显式循环,可以对第一个示例进行一些改进。 但是我认为这仍然不能使代码真正出色!

有关如何使用扩展点机制扩展Eclipse的一般信息,您可以参考在线文档的《 插件开发环境指南 》。

RegistryAdapter

助手实现的主要类是RegistryAdapter ,它封装了系统的IExtensionRegistry实例,并提供了一组方法来定义针对特定扩展点应执行的操作 。 目前,适配器允许读取贡献配置或创建可执行扩展。

如上所示,使用多个表示的方法对多个贡献进行评估–为了精确地评估一个贡献元素,以单数表示的方法是合适的。 这意味着对特定运行的贡献,你会用操作createExecutableExtension而不是createExecutableExtension s

根据选择的操作,可以使用不同的配置选项。 由于流畅的API实施了一种语法以提高指导和编程安全性,因此这成为可能。 例如, readExtension操作不允许注册ExecutableExtensionConfigurator ,因为这将是一个无效的组合。

withConfiguration方法允许在每个可执行扩展名创建后对其进行配置或初始化。 但是,如上面的示例所示,它也可以用于直接调用可运行扩展。 由于createExecutableExtension(s)的类型安全实现,因此可以在lambda表达式中访问扩展实例而无需强制转换。

最后,方法process()执行指定的操作,并在需要进一步处理的情况下返回创建的元素的类型化Collection

Collection<Extension> extensions= new RegistryAdapter().readExtensions( EP_ID ).process();

谓词

但是,如何通过适配器选择单个蚀扩展点贡献元素呢? 假设我们在上面的贡献定义中添加了一个属性IDRegistryAdapter的流利API允许指定可用于选择特定贡献的Predicate

public void evaluate() {new RegistryAdapter().createExecutableExtension( EP_ID, Runnable.class ).withConfiguration( ( runnable, extension ) -> runnable.run() ).thatMatches( attribute( "id", "myContribution" ) ).process();
}

有一个实用程序类Predicates ,它提供一组预定义的实现,以简化诸如属性选择之类的常见用例。 上面的代码是使用静态导入实现的快捷方式:

.thatMatches( Predicates.attribute( "id", "myContribution" ) )

其中“ myContribution”代表在扩展贡献中声明的唯一ID值:

<extension point="com.codeaffine.post.contribution"><contribution id="myContribution" class="com.codeaffine.post.MyContribution"></contribution>
</extension>

当然,在预设不足的情况下,可以实现自定义谓词:

public void evaluate() {Collection<Extension> extensions = new RegistryAdapter().readExtensions( EP_ID, Description.class ).thatMatches( (extension) -> extension.getValue() != null ).process();
}

延期

通常,Eclipse扩展点评估大部分时间在IConfigurationElement 。 适配器API在区分扩展点和配置元素方面不够清晰,并提供了一个称为Extension的简单封装。 但是对于更复杂的任务, Extension实例使基础配置元素可访问。

通常, Extension为属性值,贡献名称,贡献值,嵌套贡献提供访问器,并允许创建可执行扩展。 引入此抽象的主要原因之一是拥有一个API,该API将检查后的CoreException隐式转换为运行时异常,因为我习惯于使用Fail Fast方法而无需进行大量检查后的异常处理。

异常处理

但是,如果在插件启动时调用Eclipse扩展评估或在后台执行Eclipse扩展评估,则不能选择“快速失败”。 而且,在特定的贡献引起问题之后,忽略剩余的贡献肯定是不合理的。 因此,适配器API允许使用显式异常处理来替换快速失败机制:

public void evaluate() {Collection<Runnable> contributions = new RegistryAdapter().createExecutableExtensions( EP_ID, Runnable.class ).withExceptionHandler( (cause) -> handle( cause ) ).process();[...]
}private void handle( CoreException cause ) {// do what you gotta do
}

注意,返回的贡献集合当然只包含那些没有遇到任何麻烦的元素。

在哪里得到的?

对于那些想要签出的人,这里有一个P2存储库,其中包含com.codeaffine.eclipse.core.runtime功能,提供RegistryAdapter及其随附的类。 该存储库位于:

  • http://fappel.github.io/xiliary/

源代码和问题跟踪器托管在:

  • https://github.com/fappel/xiliary

尽管目前完全没有文档,但是应该很容易开始使用本文给出的解释。 但是请记住,这个小工具还处于早期状态,可能会发生一些API更改。 特别是在循环贡献时仅处理CoreException仍然有点太弱。

结论

以上各节介绍了RegistyAdapter的基本功能,并重点介绍了它如何简化Eclipse扩展点评估。 我用适配器替换了当前项目中的旧实现,并且没有遇到任何麻烦,这意味着到目前为止,该解决方案对我来说很有希望……

但是,除了眼神之外,还有更多。 有了这个小帮手,再加上其他自定义断言类型,为扩展点的评估功能编写集成测试确实很容易。

但是,该主题超出了本文的范围,下一次将涉及该主题。 因此,请保持关注,不要忘记分享知识,以防您发现上述方法有用–谢谢!

翻译自: https://www.javacodegeeks.com/2014/10/eclipse-extension-point-evaluation-made-easy.html

eclipse扩展点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

google账号解除游戏绑定_附方法!关于物联卡手机号的绑定与解绑

我们在使用物联卡时第一步都知道绑定手机号&#xff0c;只有绑定了手机号我们才能进行正常的充值、续费、查询等日常操作&#xff0c;当我们不再使用这些物联卡时&#xff0c;你知道怎么解绑吗&#xff1f;今天&#xff0c;我们以中国移动物联卡为例&#xff0c;咱们来看一下移…

elasticsearch原理_花几分钟看一下Elasticsearch原理解析与性能调优

基本概念定义一个分布式的实时文档存储&#xff0c;每个字段 可以被索引与搜索一个分布式实时分析搜索引擎能胜任上百个服务节点的扩展&#xff0c;并支持 PB 级别的结构化或者非结构化数据用途全文检索结构化搜索分析VS传统数据库传统数据库提供精确匹配ES提供精确匹配全文检索…

spark wai_WAI-ARIA对自动完成小部件的支持

spark wai在这篇文章中&#xff0c;我想讨论一个AutoComplete小部件的可访问性。 在您键入该字段时&#xff0c;通常会使用“自动完成”窗口小部件提供建议。 在当前的工作中&#xff0c;我基于Twitter的Typeahead &#xff08;一个灵活JavaScript库&#xff09;实现了JSF组件&…

快速学习C语言的途径,让你少走弯路!

1标准C语言能干什么&#xff1f;坦白讲&#xff0c;在今天软件已经发展了半个多世纪&#xff0c;单纯的C语言什么都干不了。标准C语言库只提供了一些通用的逻辑运算方法以及字符串处理&#xff0c;当然字符串在C语言看来也是一种操作内存的方法&#xff0c;所以单纯的C什么都做…

计算机基础教育学,计算机基础教育教学改革与创新

计算机基础教育教学改革与创新伴随《国家中长期教育改革和发展规划纲要(2010-2020)》的颁布,我国计算机基础教育进入一个新的发展阶段,对计算机基础教育"面向应用、能力导向、注重素质"指导思想的深入研究和实践是深化计算机基础教育教学改革的切入点。下面是小编搜集…

C语言学习趣事_你不知道的C语言应用

一、引我一直不明白“文人相轻”是什么意思&#xff0c;也许就是说&#xff1a;文人清客之间互相瞧不起的事情吧。但对于我来说&#xff0c;文人相轻就是表示&#xff1a;无知者无畏。无论你的某一方面的语言学的怎么样&#xff0c;怎么样的牛逼&#xff0c;你可以眼光狭窄&…

html打开显示脚本错误,IE浏览器显示脚本错误怎么解决?IE浏览器脚本错误解决方法图文教程介绍...

只要一打开网页&#xff0c;就会弹出一个“当前页面的脚本发生错误”提示框&#xff0c;如下图&#xff0c;不论按“是”或者“否”&#xff0c;当打开其它网页时&#xff0c;又会弹出一个这样的“脚本错误”提示框&#xff0c;这样的问题该如何解决呢。出现这样的情况&#xf…

jenkins 新手入门安装失败_树莓派安装jenkins,安安静静做个持续集成打包机

对于java程序来说&#xff0c;手动发布服务端是耗时和无聊的&#xff0c;jenkins很好地解决了这个问题&#xff0c;闲着也是闲着就在树莓派上装个jenkins帮我们打包发布吧。这次我们需要安装三个软件&#xff1a;jdk&#xff1a;编辑java程序必要的。maven&#xff1a;maven结构…

java开发C编译器:结构体的解析和执行

用java开发C语言编译器结构体是C语言中&#xff0c;最为复杂的原生数据结构&#xff0c;它把多种原生结构结合在一起&#xff0c;形成一个有特点含义的数据结构&#xff0c;要实现一个完整的C语言编译器或解释器&#xff0c;就必须要拥有对结构体的解析能力&#xff0c;本节&am…

mysql查询会话池_用户会话,数据控件和AM池

mysql查询会话池最近&#xff0c;有人问我有关应用程序模块池的有趣问题。 众所周知&#xff0c;AM池包含用户会话引用的应用程序模块实例&#xff0c;这允许会话在后续请求时从池中获取完全相同的AM实例。 如果应用程序中有多个根应用程序模块&#xff0c;则每个模块都将拥有…

vc 控制台添加托盘显示_和硕县塑胶托盘塑料周转筐多少钱、延安塑料物流箱

他们正是利用了消费者的这种心理&#xff0c;往产品里添加一部分碳酸钙等重物质&#xff0c;不仅仅降低了他们的生成成本也极大的提高了产品自身重量&#xff0c;消费者却被蒙在鼓里。物流与采购联合会托盘专业委员会于2002年9月对北京、天津、上海、广州四大城的300余家生产、…

用python画大白_[Python][可视化]matplotlib基础入门

Python包matplotlib画图入门&#xff0c;以折线图为例。 在使用之前&#xff0c;导入matplotlib包&#xff0c;设置中文字体 import matplotlib.pyplot as plt %matplotlib inline plt.rcParams[font.family] [Microsoft YaHei] plt.rcParams[axes.unicode_minus] False PS&a…

C语言和图形界面编程打造——浪漫的表白程序

谁说程序员不浪漫&#xff1f;&#xff1f;&#xff1f;来来来一起打造一个浪漫的表白程序&#xff0c;配上好听的音乐&#xff0c;瞬间高大上。下面&#xff0c;发下代码吧&#xff0c;昨天的愤怒的小鸟推箱子版本的没发&#xff0c;今天发这个&#xff0c;&#xff0c;&#…

ei eo eq什么意思_EI源刊是什么意思

EI源刊是什么意思?EI检索分为两种&#xff0c;一种是会议论文检索&#xff0c;一种是期刊论文检索&#xff0c;这两种检索的价值和地位是不同的&#xff0c;也由此引出了EI源刊的概念&#xff0c;EI检索包括JA类型和CA类型&#xff0c;JA是期刊论文检索&#xff0c;CA是会议论…

onpagefinished等了很久才执行_学了那么多精准引流推广的方法 你知道什么才是最重要的吗...

东哥说引流在朋友圈更新了很多引流的方法和技巧&#xff0c;有一部分微友就私信我&#xff1a;引流是好方法重要还是执行力重要&#xff1f;东哥说引流想要告诉你的是&#xff1a;不管任何方法&#xff0c;都只是“术”的层面&#xff0c;方法没有好坏&#xff0c;只是根据每个…

【C语言入门学习笔记】如何把C语言程序变成可执行文件!

环境在ANSI的任何一种实现中&#xff0c;存在两种不同的环境。翻译环境&#xff1a;在这个环境里&#xff0c;源代码被转换为可执行的机器指令。执行环境&#xff1a;用于实际执行代码。翻译环境组成一个程序的每个源文件通过编译过程分别转成目标代码各个目标文件由链接器捆绑…

idea springboot 发布webservice 发布服务_阿里云发布 Spring Boot 新脚手架,真香

作者 | 良名 阿里巴巴技术专家背景相信很多人都使用过 start.spring.io 来初始化自己的 Spring Boot 工程&#xff0c;这个工具为开发者提供了丰富的可选组件&#xff0c;并且可以选择多种打包方式&#xff0c;大大方便了开发人员的使用。最近&#xff0c;阿里的 Nacos、Senti…

python简单语法_python的基本语法(一)

1.print 打印&#xff1a;print("我是大佬”&#xff09; input("请输入你的名字:") 2.注释 ctrl/ 表示选中多行注释&#xff08;实际上是单行&#xff09; #表示单行注释 """"""三引号表示多行注释 三单引号表示多行注释print(&…

netbeans6.8_NetBeans 8.0的五个新性能提示

netbeans6.8NetBeans 8.0引入了几个新的Java提示 。 尽管有很多与Java Persistence API相关的新提示&#xff0c;但我还是关注Performance类别中的五个新提示。 NetBeans 8.0引入的五个新的“性能提示”是&#xff1a; 已装箱价值的装箱 冗余String.toString&#xff08;&am…

c语言如何把c程序编译成可执行的exe文件

1、编写一段简单的代码&#xff0c;如下图所示&#xff0c;编辑一段简单的输出语句。2、依次点击菜单栏内的编译→组建→执行&#xff0c;确保这段成率可以正确执行。3、从运行结果来看程序正确&#xff0c;没有问题&#xff0c;然后找到exe可执行程序看其是否有闪退现象。4、将…