利用javax.tools动态编译执行java代码

本文介绍了如何使用Java的javax.tools包动态编译和执行Java源代码,展示了CharSequenceCompiler类的实现,以及如何在运行时生成并编译Java源代码。此外,还提供了一个测试类ExpressionCal,对比了直接计算、Java编译计算和JavaScript编译计算的性能差异。测试结果显示,Java直接计算速度最快,JavaScript计算速度最慢。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.youkuaiyun.com/inkfish )。

  参考:使用 javax.tools 创建动态应用程序

 

  javax.tools 包是一种添加到 Java SE 6 的标准 API,可以实现 Java 源代码编译,使您能够添加动态功能来扩展静态应用程序。本文将探查javax.tools包中提供的主要类,以Java表达式表示计算一个数值函数y=x*x+x。更多详情请参考《使用 javax.tools 创建动态应用程序》和javax.tools API docs

 

complier.CharSequenceCompiler源码:

 

complier.CharSequenceCompilerException源码:

 

complier.ClassLoaderImpl源码:

 

complier.FileManagerImpl源码:

 

complier.JavaFileObjectImpl源码:

 

complier.Utils源码:

 

  以上代码为complier包中所有类,它对外暴露的主要方法是:CharSequenceCompiler<T>.compile(String qualifiedClassName, CharSequence javaSource, Class<?>... types) throws CharSequenceCompilerException, ClassCastException,通过它来动态编译字符串形式表示的java源代码。除此之外,包中其他方类和方法尽量使用默认访问权限,以避免他人误用以及隐藏实现细节。

  下面是测试package中的内容:

 

complier.test.Function源码:定义了一个接口,动态编译的所有类实现这个接口。

 

complier.test.Function实现类的模板,方便类的生成。

 

complier.test.ExpressionCal源码:里面含有一个静态测试类ExpressionCal$Tester。

 

ExpressionCal$Tester测试表达式x*x+x的运行,具体测试直接计算、java编译并计算、javascript编译并计算的效率,共测试三遍以观察其效率的变化,每一遍中每种方法又用for循环运行10万次计算,忽略打印输出的耗时。测试时间使用微秒为单位,精确度取决于System.nanoTime(),详见其java docs中的说明。测试结果如下:

 

整理得到:

10万次计算
(单位:毫秒)
直接计算java编译并计算JS编译并计算
编译计算编译计算
第一遍6.46604.575.4123.358671.08
第二遍0.6744.711.42.388493.12
第三遍0.5739.491.381.878624.12

 

  可以看出,java直接计算速度超快,java编译并计算速度还是比直接计算慢1倍(不计编译时间),而JS的计算速度比直接计算慢4个数量级,简直惨不忍睹。第一次运行除JS计算外,均比较耗时,其中java第一次编译需要从磁盘上读取template文件,以后则均为内存操作。

  从测试结果看,如果需要运行一个固定的表达式,可以写死在Java程序中(废话),如果需要计算一个动态变化的表达式,如果计算次数较少(500次以下),JS较为划算,如果计算次数十分巨大,则需要考虑java编译并计算。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值