Java代碼正常是靜態編譯成位元組碼,由對應平台的JVM載入執行,靜態編譯無法動態擴展功能。動態編譯有兩種方式實現:
從源碼編譯,需要調用Java Compiler,程序需要運行於JDK(而不是JRE)之上。
動態位元組碼生成技術(如CGLib、ASM)創建類。
動態編譯可以簡化代碼,增強類功能,但也帶來了代碼復雜度,線上不易維護。
2. java怎麼利用動態編譯求四則運算式的結果貼代碼的最後注釋一下,免得我看不懂,求高手大神來回答
首先,要有個文本框,記錄下來這個表達式,你說的,是要做個計算器吧,每個按鈕提供一項功能,有數字鍵,有運算符鍵,實現一下
3. java動態編譯這個方法是不是過時了
首先,我幫你查了一下,找到一篇http://www.cnblogs.com/fangwenyu/archive/2011/10/12/2209051.html,你看看是不是跟你情況類似
其次,用ToolProvider不如直接用com.sun.tools.javac.Main.compile,你查查這個,一般動態執行java代碼的時候,網上的例子都是拿這個方法做的
4. 頁面上有個textarea,在裡面寫java代碼,然後如何動態編譯執行這段java代碼
後台獲取這段代碼之後,將其自動補全成一個java類。
然後將其用io生成為 .java文本文件
之後調用
Runtime.getRuntime().exec("x:/javac.exe xx.java ...") 編譯
最後使用反射或者代理調用這個類文件得到結果
5. 怎麼動態編譯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){
6. 有什麼動態編譯java源代碼的框架
可以的,我說說大概思路,很簡單,你自己具體實現吧,把代碼寫給你沒意義的:
將你這段字元串輸出到一個文件里,用Java類文件的方式命名。
2.調用外部javac命令將該文件編譯。
3.用類載入器(ClassLoad)動態載入新的class文件並用Class.forName()注冊該類,然後就可以正常使用了。
上面的每一步都能在中找到實現方法,自己發揮吧。
7. java編譯動態生成的類提示缺少包.類
這種情況,在A中,不可能import引用B相關的,要全部使用反射調用B類的屬性或方法。
8. 在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?"成功":"失敗");
}
}
9. java動態編譯jar找不到
~/usr/share/java/mysql-connector-java.jar
找不到MYSQL的戲,就是說明上面的路徑不對。。。。。。。。。
10. java動態編譯遇到靈異事件,求圍觀
看源碼不就好了?
ToolProvider里的:
privatestaticfinalString[]defaultToolsLocation
={"lib","tools.jar"};
privatestaticClass<?>findClass()
throwsMalformedURLException,ClassNotFoundException{
try{
returnenableAsserts(Class.forName(defaultJavaCompilerName,false,null));
}catch(ClassNotFoundExceptione){
//ignored,trylookingelsewhere
}
Filefile=newFile(System.getProperty("java.home"));
if(file.getName().equalsIgnoreCase("jre"))
file=file.getParentFile();
for(Stringname:defaultToolsLocation)
file=newFile(file,name);
URL[]urls={file.toURI().toURL()};
ClassLoadercl=URLClassLoader.newInstance(urls);
cl.setPackageAssertionStatus("com.sun.tools.javac",true);
returnClass.forName(defaultJavaCompilerName,false,cl);
}
從java.home拿的路徑,如果名字是jre,就找父目錄
那java.home取出來是什麼?還是看源碼,參考open jdk的,比較長就不帖了,有興趣可以自己搜,發鏈接審核估計會不通過,反正開源的很容易找
oracle官方對java.home的定義是Installation directory for Java Runtime Environment (JRE),這個在官方的The Java™ Tutorials里可以找到
所以可以看到如果java.home取到jdk下的jre,那自然可以從父目錄/lib找到tool.jar,如果取的是和jdk同級的單獨安裝的那個jre,就得自己復制tool.jar