java 动态编译

一、图示:

二、代码演示

package com.hy;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.net.URLClassLoader;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

import org.junit.Test;
/**
 *
 * @author Administrator
 *
 */
public class Test1 {

    @Test
    public void test1() {
        try {
            //把一个文本读入内存
            FileReader fr= new FileReader("C:\\Users\\Administrator\\Desktop\\News2.txt");
            BufferedReader br = new BufferedReader(fr);
            String line = "";
            StringBuilder sb = new StringBuilder();
            while ((line = br.readLine()) != null) {
                sb.append(line);
                sb.append("\n");
            }
            br.close();
            fr.close();

            //在某个路径下生成一个java文件
            String path = System.getProperty("user.dir")+"\\src\\com\\hy\\News2.java";
            FileWriter fw = new FileWriter(path);
            fw.write(sb.toString());
            fw.flush();
            fw.close();

            //把类编译成class文件
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();//获取java编译器
            StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);//获取一个java文件管理器
            Iterable iterable = fileManager.getJavaFileObjects(path);//生成一个特定的java文件对象
            CompilationTask compilationTask  = compiler.getTask(null, fileManager, null, null, null, iterable);//得到一个编译任务
            compilationTask.call();//编译
            fileManager.close();

            //将class载入到内存里面
            URL[] urls = new URL[]{new URL("file:/"+System.getProperty("user.dir")+"/src")};//加载这个路径下面的所有class(网络路径)
            URLClassLoader urlClassLoader = new URLClassLoader(urls);
            Class c = urlClassLoader.loadClass("com.hy.News2");
            System.out.println(c);

            Constructor constructor = c.getConstructor();//获取构造方法
            News2 news2 = (News2)constructor.newInstance();//使用构造方法得到一个实例
            news2.sayHello();//调用方法
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

注意:这里演示通过代码文本动态生成一个java对象,使用动态编译!

时间: 2024-10-14 12:36:11

java 动态编译的相关文章

Java动态编译

Java动态编译 一.动态编译简介 new创建对象是静态加载类,在编译时刻就需要加载所有可能使用到的类. 一百个类,有一个类错了,都无法编译. 通过动态加载类可以解决该问题 二.代码实例 2.1 OfficeBetter.java main接口 里面通过对Class类的动态编译 然后调用实例,完成动态编译 1 public class OfficeBetter { 2 3 public static void main(String[] args) throws InstantiationExc

java动态编译类文件并加载到内存中

如果你想在动态编译并加载了class后,能够用hibernate的数据访问接口以面向对象的方式来操作该class类,请参考笔者的这篇博文-(该博文暂未发布) 所谓动态编译,就是在程序运行时产生java类,并编译成class文件. 一.这里介绍两种动态编译java文件的方式. 第一种:使用Runtime执行javac命令 /** * 编译java类 * 使用Runtime执行javac命令 * @param name 类的全限定包名 不带后缀 例如com.test.Notice 而不要写成com.

java 动态编译图

原文地址:https://blog.51cto.com/14437184/2437964

Java_Java SE6调用动态编译

转自:http://www.cnblogs.com/flyoung2008/archive/2011/11/14/2249017.html 一.使用JavaCompiler接口编译java源程序 我们可以通过ToolProvider类的静态方法getSystemJavaCompiler来得到一个JavaCompiler接口的实例. JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); JavaCompiler中最核心的方法是r

java内存动态编译执行

1.package org.jui.core.dynamic; public class DynaCompTest { public static void main(String[] args) throws Exception { String fullName = "DynaClass"; StringBuilder src = new StringBuilder(); src.append("public class DynaClass {\n"); src

动态生成java、动态编译、动态加载

我曾经见过一个“规则引擎”,是在应用系统web界面直接编写java代码,然后保存后,规则即生效,我一直很是奇怪,这是如何实现的呢?实际这就好像jsp,被中间件动态的编译成java文件,有被动态的编译成class,同时又动态的加载到classloader中.所以,本质上,纯java得规则引擎,是100%可以实现的. 1.动态生成java源代码.这个过程太过简单,直接略过. 2.动态编译. 我看我们自己的规则引擎也有动态编译,就是在生成BOM模型的时候.但是是调用Process执行javac.但这种

java的动态编译功能

import javax.tools.JavaCompiler; import javax.tools.ToolProvider; /** * java的动态编译 * @author Administrator * */ public class Demo04 { public static void main(String[] args) { JavaCompiler compiler=ToolProvider.getSystemJavaCompiler(); int result = com

Java程序动态编译Java源文件

最近接触到公司一个项目,需要将生成的源码动态编译,记录下学习过程. 先贴出官网推荐写法: JavaCompiler.CompilationTask getTask(Writer out,                                     JavaFileManager fileManager,                                     DiagnosticListener<? super JavaFileObject> diagnosticL

JAVA之动态编译

通过Java动态生成class文件 今天说下JAVA中的动态编译,这个功能根据我现在的了解好像没有见到过用的,我Jio的吧,现在的一些在线代码编缉器可以用到了,这个具体我也不是很清楚.感兴趣的大家可以自已了解下. 说到动态编缉大家可能会想到,动态编缉肯定不是像我们平时运行程序似的在本地的平台就开始编译了. 动态编译其实是在程序的运行过程中对Java文件的编译或者是运行.class的文件.比如说我今天想装一波,我写个java的程序,又写了个另一个java的程序在小伙伴面秀,我只运行一个java程序