可程式設計的編譯器
Java透過反射機制可以動態載入一個編譯好的類,那麼能否直接載入原始碼類呢?Java 6的javax.tools包提供了在執行時刻,對Java原始碼編譯等功能。可用於:
1. 在檔案伺服器上生成一個Java檔案,然後編譯它。
2. 編譯Java檔案,然後生成一個Jar檔案,如果這個Jar檔案在classpath中,我們是否可動態載入這個Jar呢?
3. 編寫自己的IDE工具。
詳細使用見文章:Programmatic Compilation with Java
以下是案例程式碼:
1. 在檔案伺服器上生成一個Java檔案,然後編譯它。
2. 編譯Java檔案,然後生成一個Jar檔案,如果這個Jar檔案在classpath中,我們是否可動態載入這個Jar呢?
3. 編寫自己的IDE工具。
詳細使用見文章:Programmatic Compilation with Java
以下是案例程式碼:
import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; import javax.tools.JavaCompiler.CompilationTask; import sun.tools.java.ClassFile; public class CodeCompiler { public static void main(String[] args) { try{ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileManager = compiler.getStandardFileManager( null, null, null); Iterable compilationUnits1 = fileManager .getJavaFileObjects("D:\\TestClass.java"); CompilationTask task = compiler.getTask(null, fileManager, null, null, null, compilationUnits1); // Perform the compilation task. task.call(); fileManager.close(); ClassFile cf = new ClassFile(new File("TestClass.class")); validateDefaultMethods(cf); }catch(IOException ioe){ ioe.printStackTrace(); } } protected static void validateDefaultMethods(ClassFile clazzInfo) { boolean hasEquals = false; boolean hasHashCode = false; boolean hasToString = false; for (Method method : clazzInfo.getClass().getMethods()) { String methodName = method.getName(); Class[] types = method.getParameterTypes(); if ("equals".equals(methodName) && types.length == 1) { if ("java.lang.Object".equals(types[0])) { hasEquals = true; } } else if ("hashCode".equals(methodName) && types.length == 0) { hasHashCode = true; }else if("toString".equals(methodName)&& types.length == 0){ hasToString = true; } } if(hasEquals&&hasHashCode&&hasToString){ System.out.println("Valid Code"); }else{ System.out.println("Invalid Code"); } } } <p class="indent"> |
相關文章
- 程式設計師都應學習程式碼編譯器知識程式設計師編譯
- 程式設計師常用的編輯器程式設計師
- 好書妙評之《編譯器設計》編譯
- 程式碼線上編譯器(上)- 編輯及編譯編譯
- 好程式設計師web前端教程分享CSS預編譯器的再次理解程式設計師Web前端CSS編譯
- 程式設計師的自我修養-編譯連結程式設計師編譯
- 可程式設計作息時間控制器設計程式設計
- 15款C/C++程式設計師必備的編譯器和IDEC++程式設計師編譯IDE
- 每個程式設計師都應當知道的編譯器優化知識程式設計師編譯優化
- 可程式設計序控制器(PLC)程式設計
- 編寫可維護的JavaScript-程式設計風格JavaScript程式設計
- 在手機上程式設計:自制的小飛可程式設計複數計算器(小飛計算器)程式設計
- linux(ubuntu)下的64位編譯器編譯32位程式LinuxUbuntu編譯
- 名家點評之《編譯器設計(第2版)》編譯
- 編譯器的編譯基本過程編譯
- [譯]編碼,編碼,編碼!提高程式設計技能的唯一途徑程式設計
- 有關Linux的可執行程式——動態編譯、靜態編譯、readelfLinux行程編譯
- gcc 編譯器與 clang 編譯器GC編譯
- 在Progress編輯器中批次編譯程式編譯
- 你是一個編寫可除錯程式碼的程式設計師嗎?除錯程式設計師
- PLC(一)可程式設計控制器基礎程式設計
- 為什麼每個程式設計師都應該學習程式碼編譯器知識程式設計師編譯
- 【譯】說服Kotlin編譯器程式碼安全Kotlin編譯
- 淺談彙編器、編譯器和直譯器編譯
- [譯]iOS編譯器iOS編譯
- 編譯器的自展和自舉、交叉編譯編譯
- [譯] UX 設計實踐:如何設計可掃描的 Web 介面UXWeb
- FreeBSD中的GNU C編譯器--編譯器GCC(轉)編譯GC
- 學習較底層程式設計:動手寫一個C語言編譯器程式設計C語言編譯
- WDM驅動程式設計之編譯安裝篇 (轉)程式設計編譯
- 條件編譯、多檔案程式設計、結構體編譯程式設計結構體
- 程式設計=翻譯?程式設計
- 數棧產品中的程式碼編譯器編譯
- OCI程式的編譯編譯
- C語言_來了解一下GCC編譯器編譯C可執行指令碼的過程C語言GC編譯指令碼
- 表示式編譯計算器(下) (轉)編譯
- 《程式設計師的自我修養》(一)——編譯與靜態連結程式設計師編譯
- 《UNIX環境高階程式設計》apue原始碼Ubuntu下的編譯程式設計原始碼Ubuntu編譯