J2SE 8的编译
动态加载(修改)服务、高性动态业务逻辑实现(用脚本或模板引擎实现效率满足不了需求)
package compile;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URI;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class CompileTest {
	public static void main(final String[] args) throws Exception {
		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
		StandardJavaFileManager standardFileManager = compiler.getStandardFileManager(null, null, null);
		//指定到外层根目录
		URI resource = CompileTest.class.getClassLoader().getResource("").toURI();
		Path path = Paths.get(resource);
		File templateFile = path.toFile();
		System.out.println(templateFile.getAbsolutePath());
        // 指定 javac 的命令行参数
        // 注意:最好将编译后的.class文件放到当前JVM实例的类路径上,否则加载不了
        Iterable<String> options = Arrays.asList("-d", templateFile.getAbsolutePath()); 
        String className =Thread.currentThread().getStackTrace()[1].getClassName();
		Class<?> currentClass = Class.forName(className);
		String currentPackage = currentClass.getPackage().getName();
        JavaFileObject javaFileObject = new StringObject(className, "package "+currentPackage+";" +
        		"import java.util.ArrayList;"+
        		"import java.util.List;"+
                "  class CalculatorTest {" +
                "   public int multiply(int multiplicand, int multiplier) {" +
                "       System.out.println(multiplicand);" +
                "       System.out.println(multiplier);" +
                "       return multiplicand * multiplier;" +
                "   }" 
	             +"  public List<String> add(String str1, String str2) {"
	             +"      System.out.println(str1);"
	             +"      System.out.println(str2);"
	             +"      List<String> result = new ArrayList<String>();"
	             +"      result.add(str1);"
	             +"      result.add(str2);"
	             +"      return result;"
	             +"  }"
                +"}");
        Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(javaFileObject); 
		CompilationTask compilationTask = compiler.getTask(null, standardFileManager, null, options, null, compilationUnits);
        if (compilationTask.call()) {
            System.out.println("编译成功");
            Class<?> clazz = Class.forName(currentPackage+".CalculatorTest");  
            Object instance = clazz.newInstance();  
            Method m = clazz.getMethod("multiply", new Class[]{int.class, int.class});
            Object[] o = new Object[]{1, 2};
            Object returnObj =  m.invoke(instance, o);
            System.out.println("方法返回的结果:" + returnObj.toString());
            m = clazz.getMethod("add", new Class[]{String.class, String.class});
            o = new Object[]{"string 1", "string 2"};
            List returnList =  (List) m.invoke(instance, o);
            System.out.println("方法返回的结果集个数:" + returnList);
        }
	}
}
class StringObject extends SimpleJavaFileObject {
    private String contents = null;  
    public StringObject(String className, String contents) throws Exception {
        super(new URI(className), Kind.SOURCE);
        this.contents = contents;
    }  
    public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
        return contents;
    }
}  执行结果
D:\Tools\Myeclipse\MyEclipse Configuration\WorkSpace\Base\se\target\classes
编译成功
1
2
方法返回的结果:2
string 1
string 2
方法返回的结果集个数:[string 1, string 2]
J2SE 8的编译的更多相关文章
- Android的4种文件类型Java,class,dex,apk
		Java文件-----应用程序源文件 Android本身相当一部分都是用java编写而成(基本上架构图里头蓝色的部份都是用Java开发的),android的应用必须使用java来开发 Class文件- ... 
- Android 虚拟机Dalvik、Android各种java包功能、Android相关文件类型、应用程序结构分析、ADB
		Android虚拟机Dalvik Dalvik冲击 随着Google 的AndroidSDK 的发布,关于它的API 以及在移动电话领域所带来的预期影响这些方面的讨论不胜枚举.不过,其中的一个话题在J ... 
- 有关android工程的构建脚本(build.xml)的学习
		学习[android-sdk-linux根目录]/tools/ant/build.xml,觉得如下几点很有用,记录之 1)ant脚本中属性值是于前置定义优化的原则,即属性发生重复定义时,前面定义的值不 ... 
- java学习笔记(详细)
		java平台 1.J2SE java开发平台标准版 2.J2EE java开发平台企业版 java程序需要在虚拟机上才可以运行,换言之只要有虚拟机的系统都可以运行java程序.不同系统上要安装对应的虚 ... 
- Java基础学习总结(一)——Java开发学习介绍
		Java平台: 1.J2SE java开发平台标准版 2.J2EE java开发费平台企业版 Java程序需要在虚拟机上才可以运行,换言之只要有虚拟机的系统都可以运行java程序.不同的系统上要安装对 ... 
- J2EE,J2SE,J2ME,JDK,SDK,JRE,JVM区别
		转自:http://www.metsky.com/archives/547.html 一.J2EE.J2SE.J2ME区别 J2EE——全称Java 2 Enterprise Edition,是Jav ... 
- Java2_J2EE、J2SE和J2ME的区别
		解析J2EE.J2SE.J2ME.JDK的区别 本文向大家简单介绍一下JDK.J2EE.J2SE.J2ME概念及区别,J2EE,J2SE,J2ME是java针对不同的的使用来提供不同的服务 ... 
- Java2_java入门时的一些基本概念的理解(j2ee,j2se,j2me,jdk,sdk,jre,jvm,跨平台)
		什么是SDK呢? Software Develop Kit的简称,顾名思义就是软件开发包.软件开发商实现底层模块,并对其进行类库封装,配置成高级别的开发环境,为程序员上层的程序开发提供支持.譬如Goo ... 
- android 编译错误 com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0
		解决方案一: JDK版本不一致造成的,指的是高版本的JDK编译的class不能放在低版本的JDK上运行. 如果是Version 52,就表示JDK8编译的class不能运行在JDK7上,所以需要在本地 ... 
随机推荐
- 将string str中的str转换成字符数组
			#include <iostream> #include <map> #include <string.h> using namespace std; int ma ... 
- MySQL--修改MySQL账号密码
			##使用mysqladmin进行修改 mysqladmin -u username -h hostname password 'new password'; ##使用set命令进行修改 SET PAS ... 
- P·C·L 了解
			因为PCL是开源的,所以无论是商用还是研究都是免费的: 赞助商有Open Perception, Willow Garage, NVIDIA, Google, Toyota, Trimble, Urb ... 
- Apache+modjk布置tomcat集群
			一.版本: Apache: 2.2.14: 下载地址:http://archive.apache.org/dist/httpd/binaries/win32/ Mod_jk:tomcat-connec ... 
- bzoj 4650(洛谷 1117) [Noi2016]优秀的拆分——枚举长度的关键点+后缀数组
			题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4650 https://www.luogu.org/problemnew/show/P1117 ... 
- Angular 4 表单
			一. 模板表单 1. 如下图 2. code 3. 效果图 二.响应式表单 1. 增加ReactiveFormsModule 2.响应式表单用到的类和指令 3. 控制器代码 4. html <! ... 
- 【VS】使用vs2017自带的诊断工具(Diagnostic Tools)诊断程序的内存问题
			前言 一般来说.NET程序员是不用担心内存分配释放问题的,因为有垃圾收集器(GC)会自动帮你处理.但是GC只能收集那些不再使用的内存(根据对象是否被其它活动的对象所引用)来确定.所以如果代码编写不当的 ... 
- Javascript中的闭包(六)
			一.什么是闭包 函数可以记住并访问所在词法作用域时,就产生了闭包,即使在词法作用域外调用函数. (也就是说如果一个函数在执行完之后,其中的内部包含的函数仍然对该函数的作用域持有着引用(函数执行完 ... 
- SpringMVC 实现返回一段数据 & 实现自动发送json格式数据 - AJAX
			实现返回一段数据 - AJAX 当页面通过AJAX来访问Controller时,期望得到的不是一个页面而是一段数据,此时可以使用如下方法,直接向相应中写入数据: /** * 直接向响应中写出数据,通常 ... 
- 1011 World Cup Betting (20 分)
			1011 World Cup Betting (20 分) With the 2010 FIFA World Cup running, football fans the world over wer ... 
