亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java動態編譯執行代碼示例

2024-07-13 10:15:10
字體:
來源:轉載
供稿:網友

在某些情況下,我們需要動態生成java代碼,通過動態編譯,然后執行代碼。JAVAAPI提供了相應的工具(JavaCompiler)來實現動態編譯。下面我們通過一個簡單的例子介紹,如何通過JavaCompiler實現java代碼動態編譯。

一、獲取JavaCompiler

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

獲取JDK提供的java編譯器,如果沒有提供編譯器,則返回null;

二、編譯

//獲取java文件管理類StandardJavaFileManager manager = compiler.getStandardFileManager(null, null, null);//獲取java文件對象迭代器Iterable<? extends JavaFileObject> it = manager.getJavaFileObjects(files);//設置編譯參數ArrayList<String> ops = new ArrayList<String>();ops.add("-Xlint:unchecked");//設置classpathops.add("-classpath");ops.add(CLASS_PATH);//獲取編譯任務JavaCompiler.CompilationTask task = compiler.getTask(null, manager, null, ops, null, it);//執行編譯任務task.call();

當我們要編譯的源代碼中,引用了其他代碼,我們需要將引用代碼路徑設置到-classpath中,否則會編譯失敗。

三、執行

//要加載的類名String className = "xxx.xxx.xxx";//獲取類加載器ClassLoader classLoader = XXX.class.getClassLoader();//加載類Class<?> cls = classLoader.loadClass(className);//調用方法名稱String methodName = "execute";//方法參數類型數組Class<?>[] paramCls = {...};//獲取方法Method method = cls.getDeclaredMethod(methodName , paramCls);//創建類實例Object obj = cls.newInstance();//方法參數Object[] params = {...};//調用方法Object result = method.invoke(obj, params);

四、完整代碼

//ClassUtil.javaimport java.io.FileWriter;import java.io.BufferedWriter;import java.io.File;import java.io.IOException;import java.util.ArrayList;import javax.tools.JavaCompiler;import javax.tools.ToolProvider;import javax.tools.JavaFileObject;import javax.tools.StandardJavaFileManager;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class ClassUtil {	private static final Log logger = LogFactory.getLog(ClassUtil.class);	private static JavaCompiler compiler;	static{		compiler = ToolProvider.getSystemJavaCompiler();	}	/**   * 獲取java文件路徑   * @param file   * @return   */	private static String getFilePath(String file){		int last1 = file.lastIndexOf('/');		int last2 = file.lastIndexOf('//');		return file.substring(0, last1>last2?last1:last2)+File.separatorchar;	}	/**   * 編譯java文件   * @param ops 編譯參數   * @param files 編譯文件   */	private static void javac(List<String> ops,String... files){		StandardJavaFileManager manager = null;		try{			manager = compiler.getStandardFileManager(null, null, null);			Iterable<? extends JavaFileObject> it = manager.getJavaFileObjects(files);			JavaCompiler.CompilationTask task = compiler.getTask(null, manager, null, ops, null, it);			task.call();			if(logger.isDebugEnabled()){				for (String file:files)				          logger.debug("Compile Java File:" + file);			}		}		catch(Exception e){			logger.error(e);		}		finally{			if(manager!=null){				try {					manager.close();				}				catch (IOException e) {					e.printStackTrace();				}			}		}	}	/**   * 生成java文件   * @param file 文件名   * @param source java代碼   * @throws Exception   */	private static void writeJavaFile(String file,String source)throws Exception{		if(logger.isDebugEnabled()){			logger.debug("Write Java Source Code to:"+file);		}		BufferedWriter bw = null;		try{			File dir = new File(getFilePath(file));			if(!dir.exists())			        dir.mkdirs();			bw = new BufferedWriter(new FileWriter(file));			bw.write(source);			bw.flush();		}		catch(Exception e){			throw e;		}		finally{			if(bw!=null){				bw.close();			}		}	}	/**   * 加載類   * @param name 類名   * @return   */	private static Class<?> load(String name){		Class<?> cls = null;		ClassLoader classLoader = null;		try{			classLoader = ClassUtil.class.getClassLoader();			cls = classLoader.loadClass(name);			if(logger.isDebugEnabled()){				logger.debug("Load Class["+name+"] by "+classLoader);			}		}		catch(Exception e){			logger.error(e);		}		return cls;	}	/**   * 編譯代碼并加載類   * @param filePath java代碼路徑   * @param source java代碼   * @param clsName 類名   * @param ops 編譯參數   * @return   */	public static Class<?> loadClass(String filePath,String source,String clsName,List<String> ops){		try {			writeJavaFile(CLASS_PATH+filePath,source);			javac(ops,CLASS_PATH+filePath);			return load(clsName);		}		catch (Exception e) {			logger.error(e);		}		return null;	}	/**   * 調用類方法   * @param cls 類   * @param methodName 方法名   * @param paramsCls 方法參數類型   * @param params 方法參數   * @return   */	public static Object invoke(Class<?> cls,String methodName,Class<?>[] paramsCls,Object[] params){		Object result = null;		try {			Method method = cls.getDeclaredMethod(methodName, paramsCls);			Object obj = cls.newInstance();			result = method.invoke(obj, params);		}		catch (Exception e) {			logger.error(e);		}		return result;	}}

五、測試

public class ClassUtilTest {	private static final Log logger = LogFactory.getLog(ClassUtilTest.class);	public static void main(String args[]){		StringBuilder sb = new StringBuilder();		sb.append("package com.even.test;");		sb.append("import java.util.Map;/nimport java.text.DecimalFormat;/n");		sb.append("public class Sum{/n");		sb.append("private final DecimalFormat df = new DecimalFormat(/"#.#####/");/n");		sb.append("public Double calculate(Map<String,Double> data){/n");		sb.append("double d = (30*data.get(/"f1/") + 20*data.get(/"f2/") + 50*data.get(/"f3/"))/100;/n");		sb.append("return Double.valueOf(df.format(d));}}/n");		//設置編譯參數		ArrayList<String> ops = new ArrayList<String>();		ops.add("-Xlint:unchecked");		//編譯代碼,返回class		Class<?> cls = ClassUtil.loadClass("/com/even/test/Sum.java",sb.toString(),"com.even.test.Sum",ops);		//準備測試數據		Map<String,double> data = new HashMap<String,double>();		data.put("f1", 10.0);		data.put("f2", 20.0);		data.put("f3", 30.0);		//執行測試方法		Object result = ClassUtil.invoke(cls, "calculate", new Class[]{Map.class}, new Object[]{data});		//輸出結果		logger.debug(data);		logger.debug("(30*f1+20*f2+50*f3)/100 = "+result);	}

測試結果

16:12:02.860 DEBUG com.even.tools.ClassUtil - Write Java Source Code to: .../classes//com/even/test/Sum.java16:12:03.544 DEBUG com.even.tools.ClassUtil - Compile Java File:.../classes//com/even/test/Sum.java16:12:03.545 DEBUG com.even.tools.ClassUtil - Load Class[com.even.test.Sum] by sun.misc.Launcher$AppClassLoader@73d16e9316:12:03.547 DEBUG com.even.test.ClassUtilTest - {f1=10.0, f2=20.0, f3=30.0}16:12:03.547 DEBUG com.even.test.ClassUtilTest - (30*f1+20*f2+50*f3)/100 = 22.0

總結

以上就是本文關于Java動態編譯執行代碼示例的全部內容,希望對大家有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久中文字幕| 亚洲视频网站在线观看| 亚洲欧洲国产精品| 国产精品女主播视频| 午夜美女久久久久爽久久| 综合国产在线视频| 午夜精品一区二区三区av| 国产成人短视频| 成人xxxx视频| 17婷婷久久www| 欧美电影在线播放| 草民午夜欧美限制a级福利片| 久久久久久尹人网香蕉| 亚洲免费av片| 91在线观看免费高清完整版在线观看| 欧美人与性动交a欧美精品| 久久国产精品久久久久| 姬川优奈aav一区二区| 国产一区香蕉久久| 久久精品国产成人| 69av在线播放| 伊人成人开心激情综合网| 国产亚洲人成网站在线观看| 亚洲国产精品va在线看黑人| 欧美富婆性猛交| 日韩美女在线看| 国产一区二区免费| 成人淫片在线看| 欧美贵妇videos办公室| 国产精品黄色影片导航在线观看| 久久天天躁狠狠躁夜夜躁| 亚洲乱码一区二区| 欧美中文字幕第一页| 国产精品成人aaaaa网站| 亚洲图片在线综合| 亚洲欧美日韩直播| 亚洲深夜福利在线| 宅男66日本亚洲欧美视频| 国产a级全部精品| 91wwwcom在线观看| 国产精品精品国产| 日韩亚洲精品电影| 亚洲аv电影天堂网| 欧美另类在线观看| 国产精品91视频| 国产精品美女久久久久久免费| 国产精品视频在线观看| 欧美最近摘花xxxx摘花| 精品国产欧美一区二区三区成人| 日韩欧美国产黄色| 国产有码在线一区二区视频| 国产精品麻豆va在线播放| 久久成年人视频| 亚洲视屏在线播放| 中文字幕日韩精品在线观看| 日韩免费黄色av| 亚洲精品视频在线观看视频| 亚洲精品国产精品乱码不99按摩| 成人美女免费网站视频| 欧美日韩在线视频观看| 成人高清视频观看www| 欧美黑人狂野猛交老妇| 欧美亚洲激情视频| 亚洲第一网站男人都懂| 国产精品日韩专区| 亚洲免费av片| 亚洲成人久久久久| 日韩av在线免费观看一区| 欧美激情视频一区二区三区不卡| 神马国产精品影院av| 久久久在线观看| 成人动漫网站在线观看| 国产91精品久久久久久| 亚洲国产成人久久综合一区| 日韩欧美精品在线观看| 国产最新精品视频| 亚洲视频在线观看免费| 亚洲精品中文字| 日本一欧美一欧美一亚洲视频| 国产精品va在线| 国内精品伊人久久| 国产精品入口尤物| 国语自产精品视频在线看一大j8| 亚洲精品www久久久| 亚洲视频网站在线观看| 欧美精品videofree1080p| 51ⅴ精品国产91久久久久久| 55夜色66夜色国产精品视频| 国产香蕉97碰碰久久人人| 亚洲欧美精品一区| 亚洲精品福利在线| 欧美激情图片区| 91国产一区在线| 欧美日韩午夜剧场| 57pao国产成人免费| 欧美裸体视频网站| 精品一区二区三区四区在线| 国产不卡精品视男人的天堂| 亚洲欧美中文字幕在线一区| 亚洲变态欧美另类捆绑| 日本在线精品视频| 日韩亚洲欧美中文高清在线| 欧美激情2020午夜免费观看| 日韩小视频在线观看| 91精品久久久久久久久久入口| 日韩电视剧在线观看免费网站| 国产精品日本精品| 51久久精品夜色国产麻豆| 久久777国产线看观看精品| 不卡av日日日| 91视频国产高清| 欧美大胆在线视频| 美女视频黄免费的亚洲男人天堂| 色吧影院999| 国产丝袜一区二区三区免费视频| 亚洲欧美精品suv| 亚洲日韩中文字幕| 欧日韩在线观看| 日韩精品视频在线播放| 欧美高跟鞋交xxxxhd| 狠狠干狠狠久久| 三级精品视频久久久久| 日韩免费观看av| 92版电视剧仙鹤神针在线观看| 亚洲国产99精品国自产| 国产精品69精品一区二区三区| 在线播放国产一区中文字幕剧情欧美| 韩国国内大量揄拍精品视频| 国产午夜精品一区二区三区| www.xxxx精品| 亚洲精品电影网| 成人午夜高潮视频| 日韩中文字幕精品| 国产乱肥老妇国产一区二| 黑人狂躁日本妞一区二区三区| 亚洲色图18p| 中文字幕在线日韩| www.日本久久久久com.| 97视频色精品| 亚洲系列中文字幕| 久久成人精品电影| 欧美亚洲免费电影| 欧美日韩成人在线播放| 国产精品丝袜一区二区三区| 国产99视频精品免视看7| 欧美精品生活片| 亚洲国产天堂久久国产91| 7m精品福利视频导航| 国产成人精彩在线视频九色| 日韩av123| 91精品国产精品| 欧美精品videossex88| yw.139尤物在线精品视频| 色婷婷久久av| 红桃视频成人在线观看| 九九热99久久久国产盗摄| 精品在线小视频| 北条麻妃一区二区在线观看| 91精品国产亚洲| 日韩有码在线电影| 91av福利视频| 久久免费视频观看| 国产美女久久精品| 日本精品久久中文字幕佐佐木|