日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA1.6实现动态编译加载运行

發(fā)布時(shí)間:2024/7/5 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA1.6实现动态编译加载运行 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一直以為我們寫好的程序都需要預(yù)先編譯好,然后再運(yùn)行,直到今天在看書的時(shí)候才看到書上說JAVA1.6之后可以動(dòng)態(tài)的編譯JAVA文件,這著實(shí)讓我高興了一把,為什么這么興奮呢,我一心想著能用技術(shù)實(shí)現(xiàn)動(dòng)態(tài)更新APK,不用一次次的發(fā)布打包,有了動(dòng)態(tài)加載,可以說是成功了一大截。于是趕緊試試:

package com.sahadev;import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader;import javax.tools.JavaCompiler; import javax.tools.JavaCompiler.CompilationTask; import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider;public class Main {public static String FILE_PATH = "D:\\Users\\Sahadev\\workspace\\JavaDes\\src\\com\\sahadev\\Hello.java";public static void main(String[] args) {// 動(dòng)態(tài)編譯JAVA文件JavaCompiler jCompiler = ToolProvider.getSystemJavaCompiler();StandardJavaFileManager standardFileManager = jCompiler.getStandardFileManager(null, null, null);Iterable<? extends JavaFileObject> javaFileObjects = standardFileManager.getJavaFileObjects(FILE_PATH);CompilationTask task = jCompiler.getTask(null, standardFileManager, null, null, null, javaFileObjects);task.call();try {standardFileManager.close();} catch (IOException e) {}try {// 進(jìn)行類裝載URL[] urls = new URL[] { new URL("file:/" + FILE_PATH) };URLClassLoader loader = new URLClassLoader(urls);Class<?> loadClass = loader.loadClass("com.sahadev.Hello");loader.close();// 實(shí)例化對(duì)象Constructor<?> constructor = loadClass.getConstructor();Object newInstance = constructor.newInstance();// 調(diào)用對(duì)象的方法Method method = loadClass.getMethod("printf");method.invoke(newInstance);} catch (MalformedURLException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} }
Hello.java:

package com.sahadev;public class Hello {public void printf() {System.out.println("HelloWorld!");} }

運(yùn)行結(jié)果:

HelloWorld!
運(yùn)行成功!

其實(shí)在Android上是用不了這種辦法的,Android提供的Java庫里面并沒有這種方法,只能看看以后Android是否提供支持了。

總結(jié)

以上是生活随笔為你收集整理的JAVA1.6实现动态编译加载运行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。