日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

加载dll api_运行时类加载以支持不断变化的API

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 加载dll api_运行时类加载以支持不断变化的API 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

加載dll api

我維護一個IntelliJ插件 ,可以改善編寫Spock規范的體驗。 這個項目的挑戰是在單個代碼庫中支持多個且不兼容的IntelliJ API版本。 回想起來,該解決方案很簡單(這是野外適配器模式的一個示例),但是最初它需要一些思想和示例搜尋。 我今天再次在代碼中修復對新版本的支持 ,因此決定記錄一下我最初是如何解決該問題的。

根本問題是,我的編譯代碼可以在具有多個不同API版本的JVM運行時環境中加載。 我的解決方案是將項目分為四個部分:

  • 一個主項目,它不依賴于任何變化的API調用,因此在所有API版本中都是兼容的。 主項目還具有根據其自身所在的運行時環境加載適當的適配器實現的代碼。在這種情況下,我可以利用IntelliJ PicoContainer進行服務查找,但是反射API或依賴項注入也具有需要什么。
  • 一組抽象適配器,它們提供供主項目使用的API。 該項目也不依賴于API版本之間不同的任何代碼。
  • 為每個受支持的API版本實現抽象適配器的類集。 每組適配器包裝不斷變化的API調用,并針對特定的API版本進行編譯。

最簡單的處理方法是重構API中的某些內容。 這也是實際上破壞了最后一個版本的原因。 我的主要代碼需要com.intellij.lang.Language的Groovy實例。 該實例在IntelliJ 14中移動。

該代碼一直持續到14歲,因此在這種情況下,我要添加一個新適配器。 在適配器模塊中,我有一個抽象類LanguageLookup.java :

package com.cholick.idea.spock;import com.intellij.lang.Language; import com.intellij.openapi.components.ServiceManager;public abstract class LanguageLookup {public static LanguageLookup getInstance() {return ServiceManager.getService(LanguageLookup.class);}public abstract Language groovy(); }

我支持的最低IntelliJ API版本是11。在11-13之間查找Groovy語言實例是恒定的,因此第一個具體適配器位于針對IntelliJ 11 API編譯的模塊中。 LanguageLookup11.java :

package com.cholick.idea.spock;import com.intellij.lang.Language; import org.jetbrains.plugins.groovy.GroovyFileType;public class LanguageLookup11 extends LanguageLookup {public Language groovy() {return GroovyFileType.GROOVY_LANGUAGE;} }

最新的API引入了重大變化,因此第二個具體適配器位于針對其API版本14編譯的模塊中。 LanguageLookup14.java :

package com.cholick.idea.spock;import com.intellij.lang.Language; import org.jetbrains.plugins.groovy.GroovyLanguage;public class LanguageLookup14 extends LanguageLookup {public Language groovy() {return GroovyLanguage.INSTANCE;} }

最后,主項目有一個SpockPluginLoader.java類,它根據加載的運行時API注冊正確的適配器類(我省略了一些與示例無關的方法):

package com.cholick.idea.spock.adapter;import com.cholick.idea.spock.LanguageLookup; import com.cholick.idea.spock.LanguageLookup11; import com.cholick.idea.spock.LanguageLookup14; import com.intellij.openapi.application.ApplicationInfo; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.components.impl.ComponentManagerImpl; import org.jetbrains.annotations.NotNull; import org.picocontainer.MutablePicoContainer;public class SpockPluginLoader implements ApplicationComponent {private ComponentManagerImpl componentManager;SpockPluginLoader(@NotNull ComponentManagerImpl componentManager) {this.componentManager = componentManager;}@Overridepublic void initComponent() {MutablePicoContainer picoContainer = componentManager.getPicoContainer();registerLanguageLookup(picoContainer);}private void registerLanguageLookup(MutablePicoContainer picoContainer) {if(isAtLeast14()) {picoContainer.registerComponentInstance(LanguageLookup.class.getName(), new LanguageLookup14());} else {picoContainer.registerComponentInstance(LanguageLookup.class.getName(), new LanguageLookup11());}}private IntelliJVersion getVersion() {int version = ApplicationInfo.getInstance().getBuild().getBaselineVersion();if (version >= 138) {return IntelliJVersion.V14;} else if (version >= 130) {return IntelliJVersion.V13;} else if (version >= 120) {return IntelliJVersion.V12;}return IntelliJVersion.V11;}private boolean isAtLeast14() {return getVersion().compareTo(IntelliJVersion.V14) >= 0;}enum IntelliJVersion {V11, V12, V13, V14} }

最后,在需要Groovy com.intellij.lang.Language的代碼中,我獲得了LanguageLookup服務的所有權并調用其groovy方法:

... Language groovy = LanguageLookup.getInstance().groovy(); if (PsiUtilBase.getLanguageAtOffset(file, offset).isKindOf(groovy)) { ...

該解決方案允許相同的已編譯插件JAR在版本11-14之間支持IntelliJ的各種API。 我以為Android開發人員通常會實現這樣的解決方案,但是作為Web應用程序開發人員,我從來不必編寫這種解決方案。

翻譯自: https://www.javacodegeeks.com/2014/09/runtime-class-loading-to-support-a-changing-api.html

加載dll api

總結

以上是生活随笔為你收集整理的加载dll api_运行时类加载以支持不断变化的API的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲视频2 | 国产精品1区 | 久久久久国产精 | 日本在线视频一区二区 | 日本中文字幕在线观看视频 | 黄色一区二区三区四区 | 国产一卡二卡三卡四卡 | 麻豆精品国产精华精华液好用吗 | 亚洲av永久无码国产精品久久 | 欧美午夜精品理论片a级按摩 | 男女黄床上色视频免费的软件 | 污污在线观看视频 | 丁香激情网| 日韩av在线导航 | 欧美性xxxx在线播放 | 九色国产视频 | 日本丰满少妇做爰爽爽 | 国产毛片3| 国产亚洲久一区二区 | 日本韩国欧美 | a级黄色小说| 爱如潮水3免费观看日本高清 | 日少妇视频 | 97超碰在线免费观看 | 欧美三日本三级少妇三 | a激情| www国产无套内射com | 精品人妻一区二区三区麻豆91 | 国产一区精品视频 | 国产精品人妻 | 亚洲成人久久精品 | 福利片在线播放 | 欧美特黄一区二区三区 | 全国探花 | 四虎色网 | 黄页视频在线免费观看 | av电影在线播放 | 亚洲成人自拍视频 | 老司机免费精品视频 | 在线观看网站污 | 成人在线激情网 | 国产无遮挡免费视频 | 国产精品成人国产乱一区 | 亚洲性xx| 国产原创精品 | 热久久精 | 欧美性猛交 xxxx | 国产精品乱子伦 | 9久9久9久女女女九九九一九 | 日韩欧美在线一区二区三区 | 国产强被迫伦姧在线观看无码 | 久久久久久98 | 国产精品精品久久久 | 日韩不卡视频在线 | 一区二区不卡视频 | 污视频在线观看免费 | 特黄一级视频 | 欧美日性视频 | 欧美日韩国产在线播放 | 欧美一区二区在线观看视频 | 波多野结衣在线视频免费观看 | 农村妇女毛片精品久久久 | 国产精品永久免费 | 国产精品欧美精品 | 国产一区二区视频播放 | 久操资源网 | va欧美 | 在线免费观看h片 | 欧美日韩中文字幕一区二区 | www.黄色网 | 91嫩草影视| 肉大捧一进一出免费视频 | 午夜在线一区 | 日韩人妻无码精品久久免费 | 麻豆 美女 丝袜 人妻 中文 | av电影在线观看网址 | 欧美日韩人妻精品一区二区三区 | 精品国偷自产在线 | 天堂资源中文在线 | 女女h百合无遮涩涩漫画软件 | 日韩人妻精品在线 | 秋霞午夜视频 | 国产欧美一区二区三区另类精品 | 久久精品视频免费播放 | 久艹在线观看视频 | av地址在线观看 | 亚洲无遮挡 | 不卡国产视频 | 看片久久 | 在线观看99 | 91久久中文字幕 | 国产福利片一区二区 | 香蕉综合网 | 国产美女裸体无遮挡免费视频 | 国产成人精品视频ⅴa片软件竹菊 | 久久人人爽人人人人片 | 91捆绑91紧缚调教91 | 高潮一区二区 | 成人污在线观看 |