我有一個大型的數據集。我正在創建一個允許用戶提交java源文件的系統,然後將其應用於數據集。更具體地說,每個提交的java源文件都必須包含一個具有特定名稱的靜態方法,比如說toBeInvoked()。 toBeInvoked會將數據集的一行作爲數組參數。我想調用數據集中每行提交的每個源文件的toBeInvoked方法。我也需要實現安全措施(所以toBeInvoked()不能做I/O,不能調用exit等)。在用戶提交的代碼中調用靜態方法的更好方法是什麼?
目前,我的實現是這樣的:我有一個java源文件的名稱列表。對於每個文件,我創建了我編碼的自定義安全ClassLoader的實例,該實例編譯源文件並返回編譯後的類。我使用反射來提取靜態方法toBeInvoked()(例如method = c.getMethod(「toBeInvoked」,double []。class))。然後,我遍歷數據集的行,並調用每行的方法。
至少有兩個問題我的做法:
- 這似乎是痛苦的緩慢(我聽說反射趨於緩慢)
- 代碼是比較複雜的,比我想
有沒有更好的方法來完成我想要做的事情?
這裏的昂貴的東西很可能不是反射調用(除非它經常被稱爲*非常*),但彙編!你怎麼編譯這個?使用內置的'JavaCompiler'類,或通過外部的'Runtime.exec'調用?'在任何情況下,除了編譯之外,「插件」的功能通常可以通過http:// docs .oracle.com/javase/8/docs/api/java/util/ServiceLoader.html,儘管目前還不完全清楚這是否適用於您的情況。 – Marco13