import javax.tools.*; import javax.tools.JavaCompiler.CompilationTask; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; /** * 动态编译 */ public class CompilerTest { public static void main(String[] args) throws Exception { // 类的文本 String source = "public class Main1 { public static void main(String[] args) {System.out.println(\"Hello World! \");} }"; // 为 JavaFileObject 中的大多数方法提供简单实现。应子类化此类并用作 JavaFileObject 实现的基础。 // 子类可以重写此类任意方法的实现和规范,只要不违背 JavaFileObject 的常规协定。 SimpleJavaFileObject sourceObject = new CompilerTest.StringSourceJavaObject( "Main1", source); // 为查找工具提供者提供方法,例如,编译器的提供者。 // 获取此平台提供的 Java 编程语言编译器。 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); // 为此工具获取一个标准文件管理器实现的新实例。 StandardJavaFileManager fileManager = compiler.getStandardFileManager( null, null, null); Iterable<? extends JavaFileObject> fileObjects = Arrays .asList(sourceObject); // 使用给定组件和参数创建编译任务的 future。 CompilationTask task = compiler.getTask(null, fileManager, null, null, null, fileObjects); boolean result = task.call(); if (result) { System.out.println(" 编译成功。"); Class aClass = Class.forName("Main"); System.out.println(aClass.getClass()); } } /** * 主要指定了编译的存储位置和格式 */ static class StringSourceJavaObject extends SimpleJavaFileObject { private String content = null; public StringSourceJavaObject(String name, String content) throws URISyntaxException { super(URI.create("String:///util/" + name.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE); this.content = content; } public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { return content; } } }
相关推荐
Java语言-动态编译代码并热加载类,js热加载
一个动态编译,加载Java类的演示。适用如动态编写算法等情况。
NULL 博文链接:https://zheng12tian.iteye.com/blog/1488813
*1.创建 URLClassLoader 类加载器 * 2.获取当前执行的classpath的所有jar包的路径 * 3.通过java的ToolProvider创建JavaCompile,用来执行class源文件 ...创建DynamicClassLoader来加载类 ,defineClass这个方法
SpringBoot 应用动态编译 Java 源码并注入 Spring 容器,实现动态修改接口和抽象类的实现。注意,项目以 Jar 包形式启动时要在命令行引入 tools.jar 的包,IDEA下可直接调试。 基于接口、抽象类实现不停机动态调整...
springboot 、java类热加载、jarinjar、动态编译、自动引用依赖
java6提供标准包javax.tools操作Java编译器,本例实现在内存动态编译java代码,并加载动态生成类 执行 console: public class HelloWorld { public static void main(String args[]) { System.out.println("Hello...
通过 Jdk 工具类,直接将 Java 源码编译为 Class 字节码,并可加载为 Class 对象; 实例化后,可调用实例对象的方法 通过上面的实现,可以在线动态修改源码,并触发编译,加载到线上项目内,实现类似于热 部署的...
不需要任何java类文件,将字符串输入到内存,然后编译,加载,执行,整个过程全部在内存中实现,不会产生.java和.class文件,做到了洁净无污染。
java 的类动态加载实现,入口在MsgHandler 通过修改MyManager类中的输出值可用动态编译对应的class,然后替换后查看效果。
有时候需要在运行时根据模板和数据动态生成 Java 代码,然后对其进行编译生成 Class 文件,然后再将这些类加载 进去,并使用反射来创建对象。
Java 语言是一种具有动态性的解释型编程语言,当指定程序运行的时候, Java 虚拟机就将编译生成的 .class 文件按照需求和一定的规则加载进内存,并组织成为一个完整的 Java 应用程序。 Java 语言把每个单独的类 ...
3):从jar、zip等等压缩文件加载类,自动解析jar文件找到class文件去加载util类 4):从java源代码文件动态编译成为class文件 当一个类被加载、连接、初始化后,它的生命周期就开始了,当代表该类的Class对象不再...
而类加载是Java程序执行过程中的一个重要的组成部分,它实现了程序的动态加载和运行。 在字节码方面,我们将从Java语言的语法和编译原理等重要内容出发,全面解读字节码在Java程序的开发和运行中的应用。我们将详细...
其实,Java也是可以对类文件进行加密,然后由JVM直接加载的,加密方法可以选用高强度的算法,然后中间不经过任何转换,由JVM直接加载,在JVM中进行解密并加载类,这样就能有效避免类文件暴露从而被破解的问题。
java ClassLoader的学习 java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class... 一个类如果要被JVM所调度执行,必须先把这个类加载到JVM内存里,java.lang下有个很重要的类ClassL
我们这里主要介绍编译和类加载这两种机制。 一、源码编译 代码编译由JAVA源码编译器来完成。主要是将源码编译成字节码文件(class文件)。字节码文件格式主要分为两部分:常量池和方法字节码。 二、类加载 类的生命...
其实,Java也是可以对类文件进行加密,然后由JVM直接加载的,加密方法可以选用高强度的算法,然后中间不经过任何转换,由JVM直接加载,在JVM中进行解密并加载类,这样就能有效避免类文件暴露从而被破解的问题。
在运行时,当我们想生成这个类的对象时,运行这个程序的 Java虚拟机(JVM)首先检查这个类的Class对象是否已经加载。如果尚未加载,JVM就会根据类名查找.class文件,并将其载入。 一旦某个类的Class对象被载入内存...
Java 程序在运行期间可以动态加载、解析和使用一些在编译阶段并不确定的类型数据,这一机制被称为反射(Reflection)。反射库(reflection library)提供了一个非常丰富且精心设计的工具类,以便编写能够动态操纵Java...