博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java动态编译
阅读量:6164 次
发布时间:2019-06-21

本文共 2506 字,大约阅读时间需要 8 分钟。

hot3.png

1、只要是在本地静态编译能够实现的任务,比如编译参数、输入输出、错误监控等,动态编译就都能实现。

2、Java 的动态编译对源提供了多个渠道。比如, 可以是字符串( 例子中就是字符

串),可以是文本文件,也可以是编译过的字节码文件(.class 文件),只要是符合Java 规范的就都可以在运行期动态加载, 其实现方式就是实现JavaFileObject 接口, 重写getCharContent、openInputStream、openOutputStream,或者实现JDK 已经提供的两个实现类SimpleJavaFileObject、ForwardingJavaFileObject,具体代码可以参考如下的例子。

package xjt.gone;import java.io.File;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import javax.tools.JavaCompiler;import javax.tools.JavaFileObject.Kind;import javax.tools.StandardJavaFileManager;import javax.tools.ToolProvider;public class JIT {	public static void main(String[] args)throws Exception{		// 类名		String clsName = "Hello";		// 方法名		String methodName = "sayHello";		// 当前编译器		JavaCompiler cmp = ToolProvider.getSystemJavaCompiler();		//Java 标准文件管理器		StandardJavaFileManager fm = cmp.getStandardFileManager(null,null,null);		//Java 文件对象		XJavaFileObject jfo = new XJavaFileObject(new File("D:/Hello.java"),Kind.SOURCE);		// 编译参数,类似于javac 
中的options List
optionsList = new ArrayList
(); // 编译文件的存放地方 optionsList.addAll(Arrays.asList("-d","F:/sth/myeclipse/gone/WebRoot/WEB-INF/classes")); // 要编译的单元 List
jfos = Arrays.asList(jfo); // 设置编译环境 JavaCompiler.CompilationTask task = cmp.getTask(null, fm, null, optionsList,null,jfos); if(task.call()){ // 生成对象 Object obj = Class.forName(clsName).newInstance(); Class
cls = obj.getClass(); // 调用sayHello 方法 Method m = cls.getMethod(methodName); String str = (String) m.invoke(obj); System.out.println(str); } }}

package xjt.gone;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import javax.tools.SimpleJavaFileObject;public class XJavaFileObject extends SimpleJavaFileObject {	private File file;	public XJavaFileObject(File file, Kind kind) {		super(file.toURI(), kind);		this.file = file;	}	@Override	public CharSequence getCharContent(boolean ignoreEncodingErrors)			throws IOException {		StringBuffer sb = new StringBuffer();		FileReader fReader = new FileReader(file);		BufferedReader bufferedReader = new BufferedReader(fReader);		String s = null;		while ((s=bufferedReader.readLine())!=null) {			sb.append(s);		}		bufferedReader.close();		return sb.toString();	}}

Hello.java

public class Hello {	public String sayHello(){		System.out.println("逝者如斯");		return "2";	}}

转载于:https://my.oschina.net/xiejuntao/blog/187030

你可能感兴趣的文章
Eclipsed的SVN插件不能识别之前工作空间的项目
查看>>
Linux 查看iptables状态-重启
查看>>
amazeui学习笔记一(开始使用2)--布局示例layouts
查看>>
c#中lock的使用(用于预约超出限额的流程)
查看>>
ODI基于源表时间戳字段获取增量数据
查看>>
并发容器之CopyOnWriteArrayList(转载)
查看>>
什么是AAC音频格式 AAC-LC 和 AAC-HE的区别是什么
查看>>
原创:goldengate从11.2升级到12.1.2
查看>>
Quartz
查看>>
正则表达式的语法规则
查看>>
C#一个关于委托和事件通俗易懂的例子
查看>>
类似于SVN的文档内容差异对比工具winmerge
查看>>
Cause: java.sql.SQLException: The user specified as a definer ('root'@'%') does not exist
查看>>
quratz线程
查看>>
execnet: rapid multi-Python deployment
查看>>
windows修改3389端口
查看>>
关于JavaScript词法
查看>>
FreeSwitch中的会议功能(4)
查看>>
MySQL中创建用户分配权限(到指定数据库或者指定数据库表中)
查看>>
AutoReleasePool 和 ARC 以及Garbage Collection
查看>>