java6 动态编译_Java SE6调用动态编译

一、使用JavaCompiler接口编译java源程序

我们可以通过ToolProvider类的静态方法getSystemJavaCompiler来得到一个JavaCompiler接口的实例。

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

JavaCompiler中最核心的方法是run。通过这个方法可以编译java源程序。这个方法有3个固定参数和1个可变参数(可变参数是从Jave SE5开始提供的一个新的参数类型,用type… argu表示)。前3个参数分别用来为java编译器提供参数、得到Java编译器的输出信息以及接收编译器的错误信息,后面的可变参数可以传入一个或多 个Java源程序文件。如果run编译成功,返回0。

int run(InputStream in, OutputStream out, OutputStream err, String... arguments)

如果前3个参数传入的是null,那么run方法将以标准的输入、输出代替,即System.in、System.out和System.err。

下面是利用java动态编译实现eval功能:

package com.flyoung;

import java.io.File;

import java.io.FileWriter;

import java.io.PrintWriter;

import java.lang.reflect.Method;

import javax.tools.JavaCompiler;

import javax.tools.ToolProvider;

public class JavacTest {

public JavacTest(){

}

public static void eval(String str){

System.out.println(System.getProperty("user.dir"));//当前工作目录 String s = "public class Temp{" ;

s+="\r\n"+" public static String call(String ss){ ";

s+="\r\n"+" System.out.println(\""+str+"\"); ";

s+="\r\n"+" return \"return_str\"; ";

s+="\r\n"+" }";

s+="\r\n"+"}";

try{

File file = new File("Temp.java");

PrintWriter pw = new PrintWriter(new FileWriter(file));

//pw.println(s);//pw.write(s); pw.close();

//动态编译 JavaCompiler javac = ToolProvider.getSystemJavaCompiler();

int status = javac.run(null, null, null, "-d",System.getProperty("user.dir")+"/bin","Temp.java");

if(status!=0){

System.out.println("没有编译成功!");

}

//动态执行 Class cls = Class.forName("Temp");//返回与带有给定字符串名的类 或接口相关联的 Class 对象。 Method method = cls.getDeclaredMethod("call", String.class);//返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法 String result= (String)method.invoke(null, str);//静态方法第一个参数可为null,第二个参数为实际传参 System.out.println(result);

}catch(Exception e){

e.printStackTrace();

}

}

/***@paramargs*/

public static void main(String[] args) {

//TODO Auto-generated method stub JavacTest javacTest = new JavacTest();

javacTest.eval("input_str");

}

}

二、使用StandardJavaFileManager编译java源程序

在Java SE6中最好的方法是使用StandardJavaFileManager类。这个类可以很好地控制输入、输出,并且可以通过DiagnosticListener得到诊断信息,而DiagnosticCollector类就是listener的实现。

使用StandardJavaFileManager需要两步。首先建立一个DiagnosticCollector实例以及通过 JavaCompiler的getStandardFileManager()方法得到一个StandardFileManager对象。最后通过 CompilationTask中的call方法编译源程序。

2c4aaf9edfd7eba4da8dc04c3a585a8a.png

fe64b06b85c37579a20f56eae1465ba1.png

99afa1e47e6a16b7d7d6f80f3630d942.png

示例:

package com.flyoung;

import java.io.File;

import java.io.FileWriter;

import java.util.Arrays;

import javax.tools.JavaCompiler;

import javax.tools.StandardJavaFileManager;

import javax.tools.ToolProvider;

import javax.tools.JavaCompiler.CompilationTask;

public class DynamicCompileTest {

public static void main(String[] args) throws Exception {

//1.创建需要动态编译的代码字符串 String nr="\r\n";//回车换行 String source="package com.flyoung.hello;"+nr+

" public class Hello{"+nr+

" public static void main(String[] args){"+nr+

" System.out.println(\"helloworld!\");"+nr+

"}"+nr+

"}" ;

//2.将预动态编译的代码写入文件中1:创建临时目录 2:写入临时文件 File dir=new File(System.getProperty("user.dir")+"/temp");//临时目录//如果/temp目录不存在创建temp目录 if(!dir.exists()){

dir.mkdir();

}

FileWriter writer=new FileWriter(new File(dir,"Hello.java"));

writer.write(source);//将字符串写入文件中 writer.flush();

writer.close();

//3:取得当前系统java编译器 JavaCompiler javaCompiler=ToolProvider.getSystemJavaCompiler();

//4:获取一个文件管理器StandardJavaFileManage StandardJavaFileManager javaFileManager=javaCompiler.getStandardFileManager(null, null, null);

//5.文件管理器根与文件连接起来 Iterable it=javaFileManager.getJavaFileObjects(new File(dir,"Hello.java"));

//6.创建编译的任务 CompilationTask task=javaCompiler.getTask(null,

javaFileManager,null,Arrays.asList("-d","./temp"), null, it);

//执行编译 task.call();

javaFileManager.close();

}

}

三、从内存中动态编译源程序

JavaCompiler 不仅能编译硬盘上的 Java 文件,而且还能编译内存中的 Java 代码,然后使用reflection来运行他们。

4e03c22a6db302e43623d45edee48ee5.png

package com.flyoung;

import java.io.IOException;

import java.net.URI;

import javax.tools.SimpleJavaFileObject;

public class JavaStringObject extends SimpleJavaFileObject {

private String code;

public JavaStringObject(String name, String code) {

//super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE); super(URI.create(name+".java"), Kind.SOURCE);

this.code = code;

}

@Override

public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException

{

return code;

}

}

package com.flyoung;

import java.io.PrintWriter;

import java.io.StringWriter;

import java.lang.reflect.Method;

import java.net.URL;

import java.net.URLClassLoader;

import java.util.Arrays;

import javax.tools.JavaCompiler;

import javax.tools.JavaFileObject;

import javax.tools.ToolProvider;

import javax.tools.JavaCompiler.CompilationTask;

public class DynamicCompileTest {

public static void main(String[] args) throws Exception {

/** 编译内存中的java代码*/

//将代码写入内存中 StringWriter writer = new StringWriter();//内存字符串输出流 PrintWriter out = new PrintWriter(writer);

out.println("package com.flyoung.hello;");

out.println("public class Hello{");

out.println("public static void main(String[] args){");

out.println("System.out.println(\"helloworld!\");");

out.println("}");

out.println("}");

out.flush();

out.close();

//开始编译 JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();

JavaFileObject fileObject = new JavaStringObject("Hello", writer.toString());

CompilationTask task=javaCompiler.getTask(null, null, null,

Arrays.asList("-d","./bin"), null, Arrays.asList(fileObject));

boolean success=task.call();

if(!success){

System.out.println("编译失败!");

}

else{

System.out.println("编译成功!");

//利用反射调用其中的main()方法//Class class1=Class.forName("com.flyoung.hello.Hello");//ClassLoader是自动去从当前工作目录下的classpath路径下去找 也就是bin目录下//Class class1=ClassLoader.getSystemClassLoader().loadClass("com.flyoung.hello.Hello");//利用URLClassLoader去实例化一个Class类 类文件可以放在任意位置,这样就很方便了 URL[] urls=new URL[]{new URL("file:/"+"./bin/")};

URLClassLoader classLoader=new URLClassLoader(urls);

Class class1=classLoader.loadClass("com.flyoung.hello.Hello");

Method method=class1.getDeclaredMethod("main",String[].class);

String[] args1={null};

method.invoke(class1.newInstance(),args1);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值