在程序中实现java源文件编译,在程序中实现对java源文件编译的3种方法

一般情况下对java源文件的编译均是在代码完成后使用javac编译的,不管是使用 IDE还是直接使用命令行。这里要说的情况是比较特别的,就是在代码内动态的编译一些代码。比如你想通过在某个目录下通过放置一些源代码的方式来实现对程序功能的动态扩展,那么你的程序就需要具有一种对源代码的编译、加载、运行的能力,可能就需要本文介绍的3种方法。

方法1:通过调用本机的javac命令来编译。

在java程序中调用javac命令可以通过调用Runtime类的exec或是ProcessBuilder类的start方法来完成,这两个类的功能基本相同,用法也比较相似,这里的例子我们就用ProcessBuilder来演示。如果是JDK1.5之前的版本请使用Runtime类完成相同的功能。

开始之前先来点准备工作,将下面的类放到 c:\mytest\src\ 目录下,这个类我们不会在IDE中编译,而是由我们程序完成其编译。保存时使用UTF-8格式。可以直接在附件中下载这个类。

Java代码 [img]http://www.doczj.com/doc/69637c3d376baf1ffc4fadb0.html/attachments/images/302-icon_copy.gif[/img]

public class HelloWorld {

public void sayHello(String in)

{

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

System.out.println("使用编译方式:" + in);

}

}

public class HelloWorld {

public void sayHello(String in)

{

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

System.out.println("使用编译方式:" + in);

}

}

准备工作完成,下面就看一下我们程序的代码,这里只列出主要代码

Java代码 [img]http://www.doczj.com/doc/69637c3d376baf1ffc4fadb0.html/attachments/images/302-icon_copy.gif[/img]

public class JavacCompile {

private static String filePath = "c:\\mytest\\src\\HelloWorld.java";

private static String binDir = "c:\\mytest\\bin";

public static void main(String[] args) {

File binOutDir = new File(binDir);

if (!binOutDir.exists())

{

binOutDir.mkdirs();

}

// 设置javac的编译参数,使用-encoding指定编码方式,-d并指定编译生成class文件目录

ProcessBuilder pb = new ProcessBuilder("javac","-encoding", "UTF-8","-d", binDir, filePath);

try {

// 开始调用javac命令编译

final Process proc = pb.start();

// 处理进程的输出,避免挂死

new Thread(new Runnable() {

public void run() {

processStream(proc.getInputStream());

processStream(proc.getErrorStream());

}

}).start();

// 等待编译完成

proc.waitFor();

// 加载编译好的类,并调用相应的方法

new LoaderClassByDir(binDir).execSayHello("javac

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

apache.camel_Apache Camel 2.16发布–十大亮点

apache.camelApache Camel 2.16于上周五发布。 这篇博客文章是我尝试在此新版本中进行前10名(加1作为奖励)的亮点。 1.动态到 来自骆驼用户的最常见的常见问题是,如何将消息发送到端点,uri应该使用消息中的动态值(例…

设计模式示例_责任链设计模式示例

设计模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

edmonds算法matlab,匈牙利算法的matlab实现

匈牙利算法算法简介算法原理算法实现(附代码)测试算法简介下面摘用百度百科中的解释。匈牙利算法(Hungarian method)是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是二分图匹配最常见的算法&#xff0c…

php sqlsrv 分页,Php+SqlServer如何实现分页显示

PhpSqlServer如何实现分页显示$idmssql_connect("ddy","sa"," ") or die("连接不上");$dbmssql_select_db("ddy",$id);$query"select * from lr00 order by lr0012 desc";$resultmssql_query($query);if($result)…

java jooq_将Java EE与jOOQ结合使用的初学者指南

java jooqJava EE附带了自己的持久性API:JPA。 当您想要将RDBMS实体(表/关系)映射到Java实体(类)时,JPA最强大,主要遵循1:1映射策略。 其背后的思想是,业务逻辑通常不像关…

java ee编译器_Java EE 8 MVC:控制器的详细介绍

java ee编译器Java EE MVC是为Java EE 8计划并在JSR-371中指定的基于动作的新MVC框架。 这是我的Java EE 8 MVC教程的第二篇文章。 第一篇文章介绍了基础知识,并展示了如何开始使用 Java EE 8 MVC参考实现Ozark 。 在本文中,我们将更详细地介绍MVC控制器…

php扩展 waf,基于PHP扩展的WAF实现

访问一下看看结果:可以看到ls命令成功的执行了,也就是说我们的正常文件是不会被拦截的,而只有upload目录中的文件会被拦截,这样做又会引发另一个弊端,倘若攻击者通过某种方法将shell写入正常的文件中,或是与…

junit4 集成测试_使用JUnit规则进行干净的集成测试

junit4 集成测试JUnit Rules的优势,尤其是在进行集成测试时,几乎不能被高估。 在本文中,我们将阐明ExternalResource扩展的有用性。 在我们必须使用抽象外部资源的第三方库的情况下,这简化了灯具控制。 作为示例,我们将…

多项式在matlab中的应用,matlab的应用-多项式函数及多项式拟合

matlab的应用-多项式函数及多项式拟合 Matlab 的应用- 多项式函数及多项式拟合 本节将向大家简要介绍 matlab 在多项式处理方面的应用。 多项式函数主要有: roots 求多项式的根 poly 特征多项式 polyval 多 项式的计算 poly2str(p, x )多项式代换 polyfit 多项式曲线…

java8 从数组获取流_从数组到流再到Java 8

java8 从数组获取流不久前,我们将一些Eclipse插件项目升级到Java8。此后再也没有回头。 除其他事项外,使用lambda和streams API ,过滤,映射和查找集合中的元素变得更加容易和简洁。 我想到目前为止,对于大多数人来说&a…

乐惠科技php面试题,程序员中的奇葩,使用php构建魔兽世界

这是用PHP编写的魔兽世界服务器。现在它已经调试了登录服务器的过程。目前的魔兽世界客户端是2.4.3_8606。服务器列表和帐户密码数据需要查询AUTH库。世界服务器身份验证过程已完成,数据包加密已完成后续进程正在开发中......数据库文件在根目录: sql/sql.7z今天在群…

javafx窗体程序_JavaFX真实世界应用程序:EIZO CuratOR Caliop

javafx窗体程序JavaFX Real-World应用程序第四号称为Caliop 。 它是EIZO为医院手术室开发的CuratOR解决方案的前端。 前端在壁挂式控制台上运行,并允许操作团队查找有关患者的信息,控制各种视频源到不同显示器的路由,录制视频,拍摄…

玫瑰花函数matlab,网上收到的用matlab画玫瑰花的代码怎么不行啊,报告错误,求大神...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼function plot_rosedraw_main(450,90);function draw_main(x,y)%粉红色玫瑰arcdata{1}[65 -60 150 350 866 -54 300 470 865 -56 30 230 1064 -57 300 490 17];ellipsedata{1}[73 -30 250 450 27 4059 -30 100 290 27 4065 -40 140…

java8 streams_Java 8 Streams:过滤和谓词否定

java8 streams最近,有关LJC 邮件列表的成员在流中.filter方法中使用谓词否定的有趣讨论,因此我认为值得在博客文章中进行总结。 讨论是关于使用.filter和否定谓词的方法。 这篇文章的代码可以在我的github帐户中找到 。 也许这就是您可能会想到的方式&…

python判断相同,Python判断两个文件是否相同与两个文本进行相同项筛选的方法

python判断两个文件是否相同import hashlibdef gethash(f):linef.readline()hashhashlib.md5()while(line):hash.update(line)linef.readline()return hash.hexdigest()def ishashequal(f1,f2):str1gethash(f1)str2gethash(f2)return str1str2if __name__ __main__:f1open(&qu…

hystrix熔断 简介_Hystrix简介– Hello World

hystrix熔断 简介在以前的博客文章中,我介绍了需要像Netflix Hystrix这样的库的动机。 在这里,我将跳入一些非常基本的方法来开始使用Hystrix,并在更复杂的用例中进行跟进。 你好,世界 以下是“ Hystrix命令”的一个简单的Hello …

php中哪个函数用于读取文件,PHP内置函数fget读取文件

php fgets()函数从文件指针读取一行语法:fgets(file,length)参数说明必需的. 指定姚要读取的文件长度可选. 指定姚都区的字节数. 默认值为102字节从文件所指向的文件中读取一行,并返回最大长度为1个字节的字符串. 遇到换行符(包含在返回值中,)&#xff0…

c++返回指针时候注意提防_提防Java中的函数式编程!

c返回指针时候注意提防这对函数式编程并不会造成太大的影响,这真棒。 这是关于某些实践的警告,您很可能会将其应用于您的代码,而这是完全错误的! 。 高阶函数对于函数式编程是必不可少的,因此,谈论它们将帮…

centos php支持yaf,CentOS环境下给PHP7.0安装yaf扩展

|CentOS环境下给PHP7.0安装yaf扩展在CentOS环境下给PHP7.0安装yaf扩展,首先要知道PHP的安装目录在哪里,以我当前的路径为例,在/usr/local/php目录下。下一步需要下载扩展包,进入http://pecl.php.net/package/yaf寻找符合版本要求的…

linux内核编译如何选择cpu类型,Ubuntu内核编译和CPU Hot-Plug特性配置全过程及遇到问题记录...

最近编译Palacios需要linux的内核支持cpu Hot-Plug(内存热插拔)特性,无奈我机器上安装的Ubuntu10.04系统默认不支持内存热插拔特性,所以需要修改配置文件并重新编译linux内核,然后就开始了漫长的linux内核编译过程,幸好有个大神帮…