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

简介: 一直以为我们写好的程序都需要预先编译好,然后再运行,直到今天在看书的时候才看到书上说JAVA1.6之后可以动态的编译JAVA文件,这着实让我高兴了一把,为什么这么兴奋呢,我一心想着能用技术实现动态更新APK,不用一次次的发布打包,有了动态加载,可以说是成功了一大截。

一直以为我们写好的程序都需要预先编译好,然后再运行,直到今天在看书的时候才看到书上说JAVA1.6之后可以动态的编译JAVA文件,这着实让我高兴了一把,为什么这么兴奋呢,我一心想着能用技术实现动态更新APK,不用一次次的发布打包,有了动态加载,可以说是成功了一大截。于是赶紧试试:

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) {
		// 动态编译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 {
			// 进行类装载
			URL[] urls = new URL[] { new URL("file:/" + FILE_PATH) };
			URLClassLoader loader = new URLClassLoader(urls);
			Class<?> loadClass = loader.loadClass("com.sahadev.Hello");
			loader.close();
			// 实例化对象
			Constructor<?> constructor = loadClass.getConstructor();
			Object newInstance = constructor.newInstance();
			// 调用对象的方法
			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!");
	}
}


运行结果:

HelloWorld!

运行成功!

其实在Android上是用不了这种办法的,Android提供的Java库里面并没有这种方法,只能看看以后Android是否提供支持了。

目录
相关文章
|
11月前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
671 7
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
455 7
|
IDE Java 编译器
Java:如何确定编译和运行时类路径是否一致
类路径(Classpath)是JVM用于查找类文件的路径列表,对编译和运行Java程序至关重要。编译时通过`javac -classpath`指定,运行时通过`java -classpath`指定。IDE如Eclipse和IntelliJ IDEA也提供界面管理类路径。确保编译和运行时类路径一致,特别是外部库和项目内部类的路径设置。
891 5
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
363 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
分布式计算 大数据 Java
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
311 1
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
|
Java Maven Spring
用Spring导致的无法运行Java文件的问题的解决方案
本文提供了解决在IntelliJ IDEA社区版中使用Spring Initializr插件创建Spring项目后,Java文件无法运行的问题的方法,主要是通过加载Maven项目来解决。
278 0
|
Java
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
本文介绍了Java中this和super关键字的用法,包括在构造方法中使用this来区分参数和成员变量、使用super调用父类构造方法和方法,以及它们在同一个方法中同时使用的场景。
698 0
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
|
存储 Java
java的各种加载和初始化的详细过程
一、什么时候加载和初始化 1、类什么时候加载 类的加载是通过类加载器(Classloader)完成的,它既可以是饿汉式[eagerly load](只要有其它类引用了它就加载)加载类,也可以是懒加载[lazy load](等到类初始化发生的时候才加载)。
2149 0
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
277 1
|
5月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
295 1