可程式設計的編譯器
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編譯
- 程式設計師的自我修養-編譯連結程式設計師編譯
- 有關Linux的可執行程式——動態編譯、靜態編譯、readelfLinux行程編譯
- 程式碼線上編譯器(上)- 編輯及編譯編譯
- 可程式設計作息時間控制器設計程式設計
- 編寫可維護的JavaScript-程式設計風格JavaScript程式設計
- 可程式設計序控制器(PLC)程式設計
- 條件編譯、多檔案程式設計、結構體編譯程式設計結構體
- 程式設計=翻譯?程式設計
- PLC(一)可程式設計控制器基礎程式設計
- [譯] UX 設計實踐:如何設計可掃描的 Web 介面UXWeb
- 編譯器的自展和自舉、交叉編譯編譯
- 淺談彙編器、編譯器和直譯器編譯
- 數棧產品中的程式碼編譯器編譯
- 好程式設計師分享Linux重器vi編輯器程式設計師Linux
- 程式語言和編譯器書單(1)編譯
- 程式設計龍書的兩位作者憑藉編譯器技術獲得2020年圖靈獎程式設計編譯圖靈
- STM彙編程式設計程式設計
- VS設定 LLVM-Clang 編譯器進行編譯C++專案LVM編譯C++
- vue編譯器Vue編譯
- CUDAFORTRAN編譯器編譯
- 設計模式(十五)直譯器設計模式
- 視覺化編輯器的設計視覺化
- Java程式碼的編譯與反編譯那些事兒Java編譯
- 【譯】程式設計不容易程式設計
- 【譯】非同步程式設計:Futures非同步程式設計
- 編譯原理——C++版桌面計算器編譯原理C++
- 編譯Android下可執行命令的FFmpeg編譯Android
- Go編譯器簡介【譯】Go編譯
- ☕【Java技術指南】「編譯器專題」深入分析探究“靜態編譯器”(JAVA\IDEA\ECJ編譯器)是否可以實現程式碼優化?Java編譯Idea優化
- 值得一談的鴻蒙2.0,程式設計師們拿起你們手中的編譯器擼一下hello world鴻蒙程式設計師編譯
- 程式設計貓海龜編輯器2.0 附使用教程程式設計
- 【譯】Dart/Flutter中的非同步程式設計DartFlutter非同步程式設計
- 翻譯:《實用的Python程式設計》InstructorNotesPython程式設計Struct
- 如何讓Java編譯器幫你寫程式碼Java編譯
- mapreduce的程式設計模型,計數器程式設計模型
- [譯] 設計 QA 在應用程式設計中的重要性程式設計
- CSS預編譯器CSS編譯