當前位置:首頁 » 編程軟體 » 動態編譯java代碼

動態編譯java代碼

發布時間: 2022-12-12 05:55:59

⑴ 在java代碼中實現動態編譯java文件

importjavax.tools.*;
importjava.io.*;
/**
*@authorhardneedl
*/
finalpublicclassMyCompile{

/**
*@paramargs命令行參數只有1個,即待編譯的源代碼文件的絕對路徑
*@throwsFileNotFoundException
*/
publicstaticvoidmain(String...args)throwsFileNotFoundException{

JavaCompilercompiler=ToolProvider.getSystemJavaCompiler();
intr=compiler.run(null,null,null,args[0]);
System.out.println(r==0?"成功":"失敗");
}

}

⑵ 關於java動態編譯的問題

tomcat 中必需放在一個包中
在類前面加個 package xxxx;
編譯完放在classes 中的 xxxx目錄下即可

tomcat的預設路徑為bin目錄
/WEBINF/classes肯定不對。

⑶ 編譯java程序需要使用什麼命令

編譯命令是 javac

  1. 首先使用記事本編輯一段簡單的Java代碼

    ⑷ java動態編譯jar找不到

    ~/usr/share/java/mysql-connector-java.jar

    找不到MYSQL的戲,就是說明上面的路徑不對。。。。。。。。。

    ⑸ 如何用maven將java8寫的代碼編譯為java6平台的

    在一般的Java應用開發過程中,開發人員使用Java的方式比較簡單。打開慣用的IDE,編寫Java源代碼,再利用IDE提供的功能直接運行Java 程序就可以了。這種開發模式背後的過程是:開發人員編寫的是Java源代碼文件(.java),IDE會負責調用Java的編譯器把Java源代碼編譯成平台無關的位元組代碼(byte code),以類文件的形式保存在磁碟上(.class)。Java虛擬機(JVM)會負責把Java位元組代碼載入並執行。Java通過這種方式來實現其「編寫一次,到處運行(Write once, run anywhere)」 的目標。Java類文件中包含的位元組代碼可以被不同平台上的JVM所使用。Java位元組代碼不僅可以以文件形式存在於磁碟上,也可以通過網路方式來下載,還可以只存在於內存中。JVM中的類載入器會負責從包含位元組代碼的位元組數組(byte[])中定義出Java類。在某些情況下,可能會需要動態的生成 Java位元組代碼,或是對已有的Java位元組代碼進行修改。這個時候就需要用到本文中將要介紹的相關技術。首先介紹一下如何動態編譯Java源文件。
    動態編譯Java源文件
    在一般情況下,開發人員都是在程序運行之前就編寫完成了全部的Java源代碼並且成功編譯。對有些應用來說,Java源代碼的內容在運行時刻才能確定。這個時候就需要動態編譯源代碼來生成Java位元組代碼,再由JVM來載入執行。典型的場景是很多演算法競賽的在線評測系統(如PKU JudgeOnline),允許用戶上傳Java代碼,由系統在後台編譯、運行並進行判定。在動態編譯Java源文件時,使用的做法是直接在程序中調用Java編譯器。
    JSR 199引入了Java編譯器API。如果使用JDK 6的話,可以通過此API來動態編譯Java代碼。比如下面的代碼用來動態編譯最簡單的Hello World類。該Java類的代碼是保存在一個字元串中的。
    01 public class CompilerTest {
    02 public static void main(String[] args) throws Exception {
    03 String source = "public class Main { public static void main(String[] args) {System.out.println(\"Hello World!\");} }";
    04 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    05 StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
    06 StringSourceJavaObject sourceObject = newCompilerTest.StringSourceJavaObject("Main", source);
    07 Iterable< extends JavaFileObject> fileObjects = Arrays.asList(sourceObject);
    08 CompilationTask task = compiler.getTask(null, fileManager, null,null, null, fileObjects);
    09 boolean result = task.call();
    10 if (result) {
    11 System.out.println("編譯成功。");
    12 }
    13 }
    14
    15 static class StringSourceJavaObject extends SimpleJavaFileObject {
    16
    17 private String content = null;
    18 public StringSourceJavaObject(String name, String content) ??throwsURISyntaxException {
    19 super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
    20 this.content = content;
    21 }
    22
    23 public CharSequence getCharContent(boolean ignoreEncodingErrors) ??throws IOException {
    24 return content;
    25 }
    26 }
    27 }
    如果不能使用JDK 6提供的Java編譯器API的話,可以使用JDK中的工具類com.sun.tools.javac.Main,不過該工具類只能編譯存放在磁碟上的文件,類似於直接使用javac命令。
    另外一個可用的工具是Eclipse JDT Core提供的編譯器。這是Eclipse Java開發環境使用的增量式Java編譯器,支持運行和調試有錯誤的代碼。該編譯器也可以單獨使用。Play框架在內部使用了JDT的編譯器來動態編譯Java源代碼。在開發模式下,Play框架會定期掃描項目中的Java源代碼文件,一旦發現有修改,會自動編譯 Java源代碼。因此在修改代碼之後,刷新頁面就可以看到變化。使用這些動態編譯的方式的時候,需要確保JDK中的tools.jar在應用的 CLASSPATH中。
    下面介紹一個例子,是關於如何在Java裡面做四則運算,比如求出來(3+4)*7-10的值。一般的做法是分析輸入的運算表達式,自己來模擬計算過程。考慮到括弧的存在和運算符的優先順序等問題,這樣的計算過程會比較復雜,而且容易出錯。另外一種做法是可以用JSR 223引入的腳本語言支持,直接把輸入的表達式當做JavaScript或是JavaFX腳本來執行,得到結果。下面的代碼使用的做法是動態生成Java源代碼並編譯,接著載入Java類來執行並獲取結果。這種做法完全使用Java來實現。
    01 private static double calculate(String expr) throws CalculationException {
    02 String className = "CalculatorMain";
    03 String methodName = "calculate";
    04 String source = "public class " + className
    05 + " { public static double " + methodName + "() { return " + expr +"; } }";
    06 //省略動態編譯Java源代碼的相關代碼,參見上一節
    07 boolean result = task.call();
    08 if (result) {
    09 ClassLoader loader = Calculator.class.getClassLoader();
    10 try {
    11 Class<?> clazz = loader.loadClass(className);
    12 Method method = clazz.getMethod(methodName, new Class<?>[] {});
    13 Object value = method.invoke(null, new Object[] {});
    14 return (Double) value;
    15 } catch (Exception e) {
    16 throw new CalculationException("內部錯誤。");
    17 }
    18 } else {
    19 throw new CalculationException("錯誤的表達式。");
    20 }
    21 }
    上面的代碼給出了使用動態生成的Java位元組代碼的基本模式,即通過類載入器來載入位元組代碼,創建Java類的對象的實例,再通過Java反射API來調用對象中的方法。
    Java位元組代碼增強
    Java 位元組代碼增強指的是在Java位元組代碼生成之後,對其進行修改,增強其功能。這種做法相當於對應用程序的二進制文件進行修改。在很多Java框架中都可以見到這種實現方式。Java位元組代碼增強通常與Java源文件中的註解(annotation)一塊使用。註解在Java源代碼中聲明了需要增強的行為及相關的元數據,由框架在運行時刻完成對位元組代碼的增強。Java位元組代碼增強應用的場景比較多,一般都集中在減少冗餘代碼和對開發人員屏蔽底層的實現細節上。用過JavaBeans的人可能對其中那些必須添加的getter/setter方法感到很繁瑣,並且難以維護。而通過位元組代碼增強,開發人員只需要聲明Bean中的屬性即可,getter/setter方法可以通過修改位元組代碼來自動添加。用過JPA的人,在調試程序的時候,會發現實體類中被添加了一些額外的 域和方法。這些域和方法是在運行時刻由JPA的實現動態添加的。位元組代碼增強在面向方面編程(AOP)的一些實現中也有使用。

    ⑹ 頁面上有個textarea,在裡面寫java代碼,然後如何動態編譯執行這段java代碼

    後台獲取這段代碼之後,將其自動補全成一個java類。
    然後將其用io生成為 .java文本文件
    之後調用
    Runtime.getRuntime().exec("x:/javac.exe xx.java ...") 編譯
    最後使用反射或者代理調用這個類文件得到結果

    ⑺ 怎樣動態執行一段JAVA代碼

    首先你可以使用輸入輸出流(或者你說的可能是要用反射得到程序結果來解析)解析做出*.Java文件。

    然後可以使用runtime調用Dos下的java編譯命令編譯取得class文件。

    然後使用classloader,反射等組合執行生成的class文件。

    ⑻ 怎麼動態編譯Java源文件

    (Write once, run anywhere)」 的目標。Java類文件中包含的位元組代碼可以被不同平台上的JVM所使用。Java位元組代碼不僅可以以文件形式存在於磁碟上,也可以通過網路方式來下載,還可以只存在於內存中。JVM中的類載入器會負責從包含位元組代碼的位元組數組(byte[])中定義出Java類。在某些情況下,可能會需要動態的生成 Java位元組代碼,或是對已有的Java位元組代碼進行修改。這個時候就需要用到本文中將要介紹的相關技術。首先介紹一下如何動態編譯Java源文件。
    動態編譯Java源文件
    在一般情況下,開發人員都是在程序運行之前就編寫完成了全部的Java源代碼並且成功編譯。對有些應用來說,Java源代碼的內容在運行時刻才能確定。這個時候就需要動態編譯源代碼來生成Java位元組代碼,再由JVM來載入執行。典型的場景是很多演算法競賽的在線評測系統(如PKU JudgeOnline),允許用戶上傳Java代碼,由系統在後台編譯、運行並進行判定。在動態編譯Java源文件時,使用的做法是直接在程序中調用Java編譯器。
    JSR 199引入了Java編譯器API。如果使用JDK 6的話,可以通過此API來動態編譯Java代碼。比如下面的代碼用來動態編譯最簡單的Hello World類。該Java類的代碼是保存在一個字元串中的。
    publicclassCompilerTest{
    publicstaticvoidmain(String[]args)throwsException{
    Stringsource="publicclassMain{publicstaticvoidmain(String[]args){System.out.println(\"HelloWorld!\");}}";
    JavaCompilercompiler=ToolProvider.getSystemJavaCompiler();
    =compiler.getStandardFileManager(null,null,null);
    =newCompilerTest.StringSourceJavaObject("Main",source);
    Iterable<extendsJavaFileObject>fileObjects=Arrays.asList(sourceObject);
    CompilationTasktask=compiler.getTask(null,fileManager,null,null,null,fileObjects);
    booleanresult=task.call();
    if(result){

    ⑼ 求解 java動態編譯找不到類,往各位大蝦指導

    參照網上其他童鞋的例子與介紹,修改了一下:
    import java.io.IOException;
    import java.lang.reflect.Method;
    import java.net.URI;
    import java.net.URISyntaxException;
    import java.util.Arrays;

    import javax.tools.JavaCompiler;
    import javax.tools.JavaCompiler.CompilationTask;
    import javax.tools.JavaFileObject;
    import javax.tools.SimpleJavaFileObject;
    import javax.tools.StandardJavaFileManager;
    import javax.tools.ToolProvider;

    /**
    * 動態編譯Java 源文件
    *
    * @author shenshouer
    *
    */
    public class CompilerTest {

    public static void main(String[] args) throws Exception {
    String source = "public class Main { " + "public static void main(String[]args) {"
    + "System.out.println(\"Hello World!\");" + "} " + "}";

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
    StringSourceJavaObject sourceObject = new CompilerTest.StringSourceJavaObject("Main",
    source);
    Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(sourceObject);

    // 獲取編譯類根路徑,不然會報找不到類的錯誤
    String path = Class.class.getClass().getResource("/").getPath();
    Iterable< String> options = Arrays.asList("-d", path);

    // 增加options參數
    // CompilationTask task = compiler.getTask(null, fileManager, null, null, null, fileObjects);
    CompilationTask task = compiler.getTask(null, fileManager, null, options, null, fileObjects);

    boolean result = task.call();

    if (result) {
    System.out.println("編譯成功。");

    ClassLoader loader = CompilerTest.class.getClassLoader();
    try {
    Class<?> clazz = loader.loadClass("Main");
    Method method = clazz.getMethod("main", String[].class);
    // 修改調用參數,不然會報參數個數不對
    // Object value = method.invoke(null, new Object[] {});
    Object value = method.invoke(null, new Object[] {new String[]{}});
    System.out.println(value);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

    static class StringSourceJavaObject extends SimpleJavaFileObject {

    private String content = null;

    public StringSourceJavaObject(String name, String content) throws URISyntaxException {
    super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension),
    Kind.SOURCE);
    this.content = content;
    }

    public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
    return content;
    }
    }
    }

    ⑽ 有什麼動態編譯java源代碼的框架

    可以的,我說說大概思路,很簡單,你自己具體實現吧,把代碼寫給你沒意義的:

    1. 將你這段字元串輸出到一個文件里,用Java類文件的方式命名。

    2. 2.調用外部javac命令將該文件編譯。

    3. 3.用類載入器(ClassLoad)動態載入新的class文件並用Class.forName()注冊該類,然後就可以正常使用了。

    4. 上面的每一步都能在中找到實現方法,自己發揮吧。

熱點內容
sql2008錯誤233 發布:2025-07-03 02:28:52 瀏覽:167
創建資料庫語句mysql 發布:2025-07-03 02:14:34 瀏覽:145
python量化投資 發布:2025-07-03 02:05:11 瀏覽:804
proxy代理伺服器地址 發布:2025-07-03 01:56:52 瀏覽:909
ps選區存儲 發布:2025-07-03 01:55:21 瀏覽:841
sql2008連接數 發布:2025-07-03 01:55:20 瀏覽:245
androidstring 發布:2025-07-03 01:53:55 瀏覽:182
密碼sql注入 發布:2025-07-03 00:44:07 瀏覽:555
oa伺服器需要什麼硬體 發布:2025-07-03 00:36:05 瀏覽:512
4mol的naoh怎麼配置 發布:2025-07-03 00:19:10 瀏覽:856