可以的,我說說大概思路,很簡單,你自己具體實現吧,把代碼寫給你沒意義的:
將你這段字元串輸出到一個文件里,用Java類文件的方式命名。
2.調用外部javac命令將該文件編譯。
3.用類載入器(ClassLoad)動態載入新的class文件並用Class.forName()注冊該類,然後就可以正常使用了。
上面的每一步都能在中找到實現方法,自己發揮吧。
㈡ 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
㈢ 求解 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怎麼利用動態編譯求四則運算式的結果貼代碼的最後注釋一下,免得我看不懂,求高手大神來回答
首先,要有個文本框,記錄下來這個表達式,你說的,是要做個計算器吧,每個按鈕提供一項功能,有數字鍵,有運算符鍵,實現一下
㈤ Java 一般用啥編譯器好用 謝謝!
Borand 公司的jbuilder 9,jbuilder2005,jbuilder 2007 JBuilder是Borland公司開發的針對java的開發工具,使用JBuilder將可以快速,有效的開發各類java應用,它使用的JDK與sun公司標準的JDK不同,它經過了較多的修改,以便開發人員能夠像開發Delphi應用那樣開發java應用。 JBuilder的核心有一部分採用了VCL技術,使得程序的條理非常清晰,就算是初學者,也能完整的看完整個代碼。JBuilder另一個特點是簡化了團隊合作,它採用的互聯網工作室技術使不同地區,甚至不同國家的人聯合開發一個項目成為了可能。 簡單介紹一下Jbuilder的特點: 1Jbuilder支持最新的Java技術,包括Applets、JSP/Servlets、JavaBean以及EJB (Enterprise JavaBeans)的應用。 2用戶可以自動地生成基於後端資料庫表的EJB Java類,Jbuilder同時還簡化了EJ B的自動部署功能.此外它還支持CORBA,相應的向導程序有助於用戶全面地管理IDL(分布應用程序所必需的介面定義語言Interface Definition Language)和控制遠程對象。 3Jbuilder支持各種應用伺服器。Jbuilder與Inprise Application Server緊密集成,同時支持WebLogic Server,支持EJB 1.1和EJB 2.0,可以快速開發J2EE的電子商務應用。 4Jbuilder能用Servlet和JSP開發和調試動態Web 應用。 4利用Jbuilder可創建(沒有專有代碼和標記)純Java2應用。由於Jbuilder是用純J ava語言編寫的,其代碼不含任何專屬代碼和標記,它支持最新的Java標准。 4Jbuilder擁有專業化的圖形調試介面,支持遠程調試和多線程調試,調試器支持各種JDK版本,包括J2ME/J2SE/J2EE。JBuilder環境開發程序方便,它是純的Java 開發環境,適合企業的J2EE開發;缺點是往往一開始人們難於把握整個程序各部分之間的關系,對機器的硬體要求較高,比較吃內存,這時運行速度顯得較慢。 一直在用jbuilder寫JAVA程序和網站,很好很優秀。
㈥ 在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代碼的靜態編譯和動態編譯中的問題是什麼
Java代碼正常是靜態編譯成位元組碼,由對應平台的JVM載入執行,靜態編譯無法動態擴展功能。動態編譯有兩種方式實現:
從源碼編譯,需要調用Java Compiler,程序需要運行於JDK(而不是JRE)之上。
動態位元組碼生成技術(如CGLib、ASM)創建類。
動態編譯可以簡化代碼,增強類功能,但也帶來了代碼復雜度,線上不易維護。
㈧ JAVA的編譯器有哪些
JCreater 、JBuilder、eclipse、myeclipse、netbean這幾個是主流,eclipse和myeclipse(eclipse的擴展功能更多)是主流中的主流