字串到 Java 可編譯程式碼轉換
你能將字串轉換為可編譯的 Java 程式碼嗎?對於想要根據外部輸入動態產生程式碼的開發人員來說,這是一個常見的查詢。
資料庫擷取與評估
您希望從資料庫擷取比較表達式並在條件結構內進行評估。為了實現這一點,Java 6 提供了 Java 編譯器 API。此 API 包含 JavaCompiler 類別。
程式碼建構與編譯
在記憶體中,您可以建構 Comparator 物件的原始碼。考慮以下程式碼,儘管由於平台限制尚未對其進行測試:
String comparableClassName = ...; // the class name of the objects you wish to compare String comparatorClassName = ...; // something random to avoid class name conflicts String source = "public class " + comparatorClassName + " implements Comparable<" + comparableClassName + "> {" + " public int compare(" + comparableClassName + " a, " + comparableClassName + " b) {" + " return " + expression + ";" + " }" + "}"; JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); // Please refer to the JavaCompiler JavaDoc page for examples of the following objects (most of which can remain null) Writer out = null; JavaFileManager fileManager = null; DiagnosticListener<? super JavaFileObject> diagnosticListener = null; Iterable<String> options = null; Iterable<String> classes = null; Iterable<? extends JavaFileObject> compilationUnits = new ArrayList<? extends JavaFileObject>(); compilationUnits.add( new SimpleJavaFileObject() { // See the JavaDoc page for more details on loading the source String } ); compiler.getTask(out, fileManager, diagnosticListener, options, classes, compilationUnits).call(); Comparator comparator = (Comparator) Class.forName(comparableClassName).newInstance();
然後,您必須將適當的 Java 表達式儲存在相關資料庫欄位中,並引用變數「a」和「b」。
注意
雖然這種方法允許動態程式碼生成,但編譯任意 Java 程式碼會帶來安全性的擔憂。實施保護措施以防止惡意程式碼執行至關重要。
以上是如何將字串轉換為可編譯的 Java 程式碼並將其用於動態程式碼產生?的詳細內容。更多資訊請關注PHP中文網其他相關文章!