簡體   English   中英

從外部庫動態加載Java函數

[英]Dynamically load Java functions from external library

我正在做一個工程設計不太好的大型Java項目,實際上我們有兩個主要的開發分支。 一個分支A是第二個分支B的子集,具有第二個分支B的所有功能,但沒有在用戶操作上集成安全檢查(它們只是標記在文件上的哈希,用於標記哪個用戶執行了什么操作)。

由於開發是在A分支上完成的,因此,只要完成了一個錯誤修復,我就必須手動合並B分支上的所有工作。

代碼庫很大,並且周圍都有相互依賴的關系,但是重寫它是沒有討論的(照常發現問題)。 而且,整個架構是如此復雜,以至於任何結構上的變化都會產生奇怪的副作用。 (我意識到這是程序員的噩夢!)。

現在,作為Java初學者,我的問題是以下問題:是否可以在外部庫中“外部化”某些類的某些功能(即實現安全性檢查的所有功能),以便代碼執行每當jar文件中存在該庫時,這些函數就會執行這些函數,否則會執行普通的“無安全性”函數?

為了清楚起見,這是我想做的一小幅示意圖:

--- branch A ---
+ class ONE
  f1()
  f2()
+ class TWO
  g1()
  g2()

--- branch B ---
+ class ONE
  f1*()
  f2()
+ class TWO
  g1*()
  g2()

只要不存在該庫,該代碼就必須執行f1()和g1(),但是如果存在該庫,則執行它們的加星標版本。

理想情況下,鑒於上述問題,我只想在一組Java文件中剪切並粘貼“與安全相關的”函數,並將其編譯為庫,然后在需要時手動對這些函數進行更改-不經常修改。

是否有其他方法可以解決這種情況以防止出現這些問題?

在此先多謝!

@ RH6,您的要求當然可以,但在上述情況下可能並不容易。 但是,如上所述,基本思想是尋找所討論庫的存在/不存在並相應地執行操作。 這更多的是設計問題,並且不止一種方法,因此從一開始就應該准備修改您的設計以包含這種行為。

您可以探索的一種途徑是使用AspectJ並編織建議(圍繞建議)。 在此建議書中,您可以檢查是否存在所需的JAR,如果存在,則可以使用自定義類加載器(盡管如果JAR位於類路徑中,則沒有必要)可以加載/創建所需類的對象,並且執行f1 *()/ g1 *()方法。 如果不存在JAR,則繼續執行f1()/ g1()方法。

如您所見,上述方法的侵入性稍差(需要將構建級別的入侵引入現有代碼庫中),但它需要您修改構建過程以及開發和維護建議。

我認為您不需要動態加載函數。 例如,您可以:

  • 使B擴展A(並將其命名為SecuredA),並覆蓋f1()和g1()以添加所需的安全檢查。

  • 創建一個在f1()和g1()內部調用的SecurityManager接口。 然后,您必須創建2個實現:一個不執行任何操作(= A),另一個不執行與安全相關的功能(= B)。 然后,您僅需要根據當前情況注入/使用正確的SecurityManager。

有多種設計原則可以解決此問題。

例如:IoC(控制反轉)。

在軟件工程中,控制反轉(IoC)描述了一種設計,其中計算機程序的自定義編寫部分從通用的可重用庫接收控制流 與傳統的程序編程相比,具有這種設計的軟件體系結構會反轉控制:在傳統的編程中,表達程序目的的自定義代碼調用可重用的庫來處理通用任務,但是通過反轉控制,它是可重用的調用自定義或特定於任務的代碼的代碼。

據我所知,最受歡迎的框架是Spring 在實例化對象期間,您開始使用工廠方法。 此工廠方法將檢查XML文件中是否存在否決。 這是一個例子:

<?xml version="1.0" encoding="UTF-8"?>
 <beans ...>
   <bean id="myClass" class="package.my.MyClass" />
 </beans>

或者,如果您不喜歡Spring依賴項。 您可以使用一些反射自己創建一些東西:

Class defaultClass = package.my.MyClass.class;
String overruledClassName = System.getProperty(defaultClassName.getName + ".clazz");
Class clazz = (overruledClassName == null) ? defaultClass : Class.forName(overruledClassName);
Object createdObject = clazz.newInstance();

與包含以下屬性的屬性文件結合使用:

package.my.MyClass.clazz = package.my.MyClassVersion2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM