JAVA1.6实现动态编译加载运行
生活随笔
收集整理的這篇文章主要介紹了
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android官方开发文档Trainin
- 下一篇: ScrollView嵌套EditText