这个Janino例子主要实现将字符串编译为类然后加载使用,一次编译,多次求值,循环中的表达式结构,始终不会改变。十分适用于大数据量的算法。
- package com.neusoft;
- /**
- * <p>Date : 2012-03-22</p>
- * <p>Description: Janino使用例子</p>
- *
- * @author 小俊垃圾回收站
- *
- */
- public interface Calculater {
- public void calculate(double[] result,double[][] d);
- }
- package com.neusoft;
- import java.io.StringReader;
- import java.util.Date;
- import org.codehaus.janino.ExpressionEvaluator;
- import org.codehaus.janino.Scanner;
- /**
- * <p> Date : 2012-03-22 </p>
- * <p> Description: Janino使用例子</p>
- *
- * @author 小俊垃圾回收站
- *
- */
- public class TestJanino {
- public static void main(String[] args) {
- try {
- double[] d0 = new double[5000];
- double[] d1 = new double[5000];
- double[] r = new double[5000];
- String code = "public void calculate(double[] r,double[][] d){"
- + " for(int i=0;i<5000;i++){"
- + " r[i]=d[0][i]+d[1][i]*2;" + " }" + "}";
- Calculater c = (Calculater) ExpressionEvaluator
- .createFastClassBodyEvaluator(new Scanner(null,
- new StringReader(code)), // 要计算的表达式
- Calculater.class, // 类型
- (ClassLoader) null// 当前线程的上下文类加载器
- );
- for (int i = 0; i < 5000; i++) {
- d0[i] = Math.floor(Math.random() * 100);
- d1[i] = Math.floor(Math.random() * 100);
- }
- double[][] d = new double[][] { d0, d1 };
- Date ds = new Date();
- c.calculate(r, d);
- Date de = new Date();
- System.out.println("耗时:" + (de.getTime() - ds.getTime()));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
Janino的网站http://www.janino.net 或者 http://docs.codehaus.org/display/JANINO/Home
介绍的很详细