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上,所以需要在本地 ...
随机推荐
- MySQL--修改MySQL账号密码
##使用mysqladmin进行修改 mysqladmin -u username -h hostname password 'new password'; ##使用set命令进行修改 SET PAS ...
- 求幂pow()
pow(x, n) 求x的n次方. 最简单的方法便是计算n个x相乘 public static double pow(double x, int n) { if (n == 0) return 1; ...
- Python——包
包 —— 把解决一类问题的模块放在同一个文件夹里 包的导入 import 和 from ... import 都行 导入之前:凡是带点的,点的左边都必须是包 导入之后:点的左边可以是包.模块.函数.类 ...
- 【python】if&&for&&while语句
if语法: 类型一: if expression : if_suit else: else_suit 例如: adic={"name":"paulwinflo" ...
- JDBC进行简单的增删改查
一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操作 (1)定义记录的类(可选) (2)连接的获取 (3)insert (4)up ...
- Linux下的一些名词解释
libffi (以下E文摘自http://www.sourceware.org/libffi/) A Portable Foreign Function Interface Library. Comp ...
- Ice框架简介及Vs2013安装Ice 3.7.0步骤及实例
ICE是什么? ICE是ZEROC官网的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,支持C+ ...
- spring SOA architecture
在谈这个之前,还得再说下SOA和平台.SOA做两件事情,一个是解耦并识别可重用的服务,一个是对服务进行灵活组装和编排满足业务需求,SOA核心是业务和技术的解耦,服务和能力的复用.而在IT领域的平台平台 ...
- Valgrind使用指南和错误分析
Valgrind使用指南和错误分析 Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析.你可以在它的环境中运行你的程序来监视 ...
- python3中reduce()函数的使用方法示例
reduce() 函数会对参数序列中元素进行累积,下面这篇文章主要给大家介绍了关于python中reduce()函数的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学 ...