`

java 动态编译和加载类

    博客分类:
  • java
 
阅读更多

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语言-动态编译代码并热加载类

    Java语言-动态编译代码并热加载类,js热加载

    动态编译、加载java类

    一个动态编译,加载Java类的演示。适用如动态编写算法等情况。

    Java类动态加载(一)——java源文件动态编译为class文件

    NULL 博文链接:https://zheng12tian.iteye.com/blog/1488813

    Java动态编译Java代码,运行在内存中,并执行

    *1.创建 URLClassLoader 类加载器 * 2.获取当前执行的classpath的所有jar包的路径 * 3.通过java的ToolProvider创建JavaCompile,用来执行class源文件 ...创建DynamicClassLoader来加载类 ,defineClass这个方法

    JDK8 下 SpringBoot 应用动态编译 Java 源码并注入 Spring 容器

    SpringBoot 应用动态编译 Java 源码并注入 Spring 容器,实现动态修改接口和抽象类的实现。注意,项目以 Jar 包形式启动时要在命令行引入 tools.jar 的包,IDEA下可直接调试。 基于接口、抽象类实现不停机动态调整...

    springboot+java类热加载

    springboot 、java类热加载、jarinjar、动态编译、自动引用依赖

    Java6内存中动态编译案例

    java6提供标准包javax.tools操作Java编译器,本例实现在内存动态编译java代码,并加载动态生成类 执行 console: public class HelloWorld { public static void main(String args[]) { System.out.println("Hello...

    Jdk 动态编译 Java 源码测试 Demo

    通过 Jdk 工具类,直接将 Java 源码编译为 Class 字节码,并可加载为 Class 对象; 实例化后,可调用实例对象的方法 通过上面的实现,可以在线动态修改源码,并触发编译,加载到线上项目内,实现类似于热 部署的...

    内存中动态编译执行java代码

    不需要任何java类文件,将字符串输入到内存,然后编译,加载,执行,整个过程全部在内存中实现,不会产生.java和.class文件,做到了洁净无污染。

    Java之——类热加载

    java 的类动态加载实现,入口在MsgHandler 通过修改MyManager类中的输出值可用动态编译对应的class,然后替换后查看效果。

    Java动态生成代码并编译载入.pdf

    有时候需要在运行时根据模板和数据动态生成 Java 代码,然后对其进行编译生成 Class 文件,然后再将这些类加载 进去,并使用反射来创建对象。

    JAVA类加载

    Java 语言是一种具有动态性的解释型编程语言,当指定程序运行的时候, Java 虚拟机就将编译生成的 .class 文件按照需求和一定的规则加载进内存,并组织成为一个完整的 Java 应用程序。 Java 语言把每个单独的类 ...

    Java虚拟机JVM类加载初始化

    3):从jar、zip等等压缩文件加载类,自动解析jar文件找到class文件去加载util类 4):从java源代码文件动态编译成为class文件 当一个类被加载、连接、初始化后,它的生命周期就开始了,当代表该类的Class对象不再...

    深入理解java类加载机制

    而类加载是Java程序执行过程中的一个重要的组成部分,它实现了程序的动态加载和运行。 在字节码方面,我们将从Java语言的语法和编译原理等重要内容出发,全面解读字节码在Java程序的开发和运行中的应用。我们将详细...

    Java类文件加密保护,防止反编译

    其实,Java也是可以对类文件进行加密,然后由JVM直接加载的,加密方法可以选用高强度的算法,然后中间不经过任何转换,由JVM直接加载,在JVM中进行解密并加载类,这样就能有效避免类文件暴露从而被破解的问题。

    Java类加载器加载类顺序

    java ClassLoader的学习  java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class...  一个类如果要被JVM所调度执行,必须先把这个类加载到JVM内存里,java.lang下有个很重要的类ClassL

    详解JAVA类加载机制(推荐)

    我们这里主要介绍编译和类加载这两种机制。 一、源码编译 代码编译由JAVA源码编译器来完成。主要是将源码编译成字节码文件(class文件)。字节码文件格式主要分为两部分:常量池和方法字节码。 二、类加载 类的生命...

    Java类文件加密运行演示例子.rar

    其实,Java也是可以对类文件进行加密,然后由JVM直接加载的,加密方法可以选用高强度的算法,然后中间不经过任何转换,由JVM直接加载,在JVM中进行解密并加载类,这样就能有效避免类文件暴露从而被破解的问题。

    Java中Class类工作原理详解

    在运行时,当我们想生成这个类的对象时,运行这个程序的 Java虚拟机(JVM)首先检查这个类的Class对象是否已经加载。如果尚未加载,JVM就会根据类名查找.class文件,并将其载入。 一旦某个类的Class对象被载入内存...

    java加载类与反射机制

    Java 程序在运行期间可以动态加载、解析和使用一些在编译阶段并不确定的类型数据,这一机制被称为反射(Reflection)。反射库(reflection library)提供了一个非常丰富且精心设计的工具类,以便编写能够动态操纵Java...

Global site tag (gtag.js) - Google Analytics