新聞中心
RelProxy 旨在通過(guò)下列兩種方式提高開(kāi)發(fā)效率:

可以在生產(chǎn)環(huán)境下修改用戶(hù)代碼,而不需要重新加載整個(gè)應(yīng)用。
提高開(kāi)發(fā)效率,避免花費(fèi)過(guò)多的時(shí)間加載應(yīng)用且對(duì)性能不會(huì)有影響。
兩個(gè)目標(biāo)都要求在你的應(yīng)用中增加一些 RelProxy 代碼,注冊(cè)成一種典型的監(jiān)聽(tīng)、回調(diào)模式。這是一種“侵入”的方式。
如果你是一名Java 框架或獨(dú)立 Java 通用服務(wù)模塊的開(kāi)發(fā)者,可以將 RelProxy Java 嵌入到你的框架中,這樣能透明地為框架的終端用戶(hù)提供代碼自動(dòng)加載功能,只需要進(jìn)行一些必要的配置,而無(wú)需調(diào)用 RelProxy API。
對(duì)使用 Java 版的 RelProxy,有兩種 API 可供調(diào)用:
JProxy 及其相關(guān)類(lèi):主要是靜態(tài)方法
Java 腳本 API:基于接口
第二種方式更適合將 RelProxy 嵌入到你的 Java 框架中,這種方式是基于接口的,在你的 API 中無(wú)需暴露公共 RelProxy 類(lèi),因?yàn)樵诳蚣苤袝?huì)執(zhí)行啟動(dòng)程序。我將使用比較簡(jiǎn)單的 API:JProxyScriptEngineFactory.create()。
JProxyScriptEngine 的功能與 Jproxy 相同,也就是說(shuō)具有相同的方法。只是這種情況下,只需要使用接口。
一個(gè)簡(jiǎn)單的例子是演示如何嵌入 RelProxy 的***方式。這個(gè)例子是 RelProxy 的示例倉(cāng)庫(kù)中包含的 RelProxyBuiltin(relproxy_builtin_ex 項(xiàng)目中)。它定義了兩個(gè)監(jiān)聽(tīng)器來(lái)實(shí)現(xiàn)注冊(cè)用戶(hù)端的代碼,一個(gè)監(jiān)聽(tīng)器顯示選項(xiàng)(option),另一個(gè)執(zhí)行選擇的行為。
這個(gè)迷你框架和示例使用 NetBeans 和 Maven 開(kāi)發(fā)完成。
有兩個(gè)包:
com.innowhere.relproxy_builtin_ex :迷你框架。子包 com.innowhere.relproxy_builtin_ex.impl 只包含一個(gè)非公共的類(lèi)。
com.innowhere.relproxy_builtin_ex_main :一個(gè)簡(jiǎn)單的使用示例。
迷你框架(公共類(lèi)和接口):
RelProxyBuiltinRoot.java
|
1 2 3 4 5 6 7 8 9 10 |
|
RelProxyBuiltin.java
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
OutputListener.java
|
1 2 3 4 5 6 |
|
CommandListener.java
|
1 2 3 4 5 6 |
|
現(xiàn)在看一下實(shí)現(xiàn)細(xì)節(jié),該類(lèi)演示了怎樣簡(jiǎn)單地內(nèi)嵌 RelProxy:
RelProxyBuiltinImpl.java
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
|
這三個(gè)方法足以解釋怎樣啟動(dòng) RelProxy Java 引擎,怎樣簡(jiǎn)單地使用指令監(jiān)聽(tīng)器來(lái)注冊(cè)熱加載。
RelProxyBuiltinImpl.java (部分)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
公共方法 RelProxyBuiltin.getJProxyScriptEngine() 必須在啟動(dòng)時(shí)執(zhí)行,用于配置 RelProxy。如果沒(méi)有配置,RelProxy 就不起作用。
請(qǐng)記住,通過(guò) create(…) 創(chuàng)建的代理對(duì)象需要能正確的執(zhí)行 hashCode() 方法和 equals(Object) 方法,監(jiān)聽(tīng)器集合、監(jiān)聽(tīng)記錄依賴(lài)這兩個(gè)方法來(lái)區(qū)別監(jiān)聽(tīng)器對(duì)象。
這是基于控制臺(tái)的示例代碼(名稱(chēng)與 JUnit 類(lèi)似,但確實(shí)不是 JUnit 的測(cè)試示例):
Main.java
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
|
看一下這段代碼:
Main.java (部分)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
我們獲取并注冊(cè)應(yīng)用源代碼的根目錄,該代碼“可能”會(huì)被重新加載。
我們需要排除框架代碼,因?yàn)檫@顯然不是用戶(hù)的代碼(不需要重新加載)。此外,還需要排除 Main.java 文件,該文件包含了測(cè)試代碼,也不需要重新加載,只有 TestListener.java 類(lèi)(與 Main.java 在同一文件夾下)需要(必需)重新加載。
*** TestListener.java 類(lèi)包含兩個(gè)監(jiān)聽(tīng)器,CommandListener 的實(shí)現(xiàn)采用匿名內(nèi)部類(lèi)的方式,主要目的是為了演示。
TestListener.java
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
先預(yù)定義可選項(xiàng),然后執(zhí)行 Main 類(lèi)。為了校驗(yàn) RelProxy 是否起作用,可以在不停止程序的運(yùn)行的基礎(chǔ)上增加一個(gè)新的可選項(xiàng)“same”。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
下一篇文章中將處理包含當(dāng)前“same”的行為,不需要停止控制臺(tái)應(yīng)用。
ItsNat web 框架可能是***個(gè)使用 RelProxy 技術(shù)的應(yīng)用(版本 v1.4)。
注意:使用 RelProxy 0.8.7 或更高的版本,這個(gè)版本在嵌入方式上做了改進(jìn)。
名稱(chēng)欄目:使用RelProxy提高Java開(kāi)發(fā)效率
文章URL:http://m.fisionsoft.com.cn/article/dhhshec.html


咨詢(xún)
建站咨詢(xún)
