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上,所以需要在本地 ...
随机推荐
- Dataframe 新增一列, apply 通用方法
df['c'] = df.apply(lambda row: 1 if row['a'] < 0 and row['b'] > 0 else 0, axis=1) apply 是一个好方法 ...
- 【转】每天一个linux命令(15):tail 命令
原文网址:http://www.cnblogs.com/peida/archive/2012/11/07/2758084.html tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f ...
- HIVE之 Sqoop 1.4.6 安装、hive与oracle表互导
1. sqoop数据迁移 1.1 概述 sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具. 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS.HI ...
- sqlserver 同义名的使用
USE [ccflow5]GOdrop synonym ccusergo/****** Object: Synonym [dbo].[ccuser] Script Date: 11/12/20 ...
- Hyper-V 虚拟机连网
参考:http://www.cnblogs.com/chenxizhang/p/3188005.html(个人推荐) 参考:http://blog.csdn.net/elvis_0123/articl ...
- oracle 导入excel
方法二.利用PLSQL Developer使用PLSQL Developer工具,这个可是大名鼎鼎的Oracle DBA最常使用的工具.在单个文件不大的情况下(少于100000行),并且目的表结构已经 ...
- opencv读取并播放avi视屏
视屏的本质是一些静态的图像的集合,opencv可以不断读取视屏中的图片,显示,就产生了类似电影的效果. 这样也就可以通过opencv对实时的视屏流进行处理了. #include "stdaf ...
- Real FFT
[文/告别年代 Email:byeyear@hotmail.com] FFT算法是针对复信号的,而现实场景中很多时候时域是实信号,此时有两种办法加快FFT的速度. 1. 使用一个N点的复FFT同时 ...
- 【XMLHttpRequest】获取XMLHttpRequest
// 获取http请求 function getXMLHttpRequest() { req = false; //本地XMLHttpRequest对象 if (window.XMLHttpReque ...
- 小峰mybatis(4)mybatis使用注解配置sql映射器
主流开发还是使用xml来配置:使用注解配置比较快,但是不支持所有功能:有些功能还是得用配置文件: 一.基本映射语句: @Inert @Update @Delete @Select 二.结果集映射语句 ...