用Java开发一个工具类,提供似于js中eval函数功能的eval方法
今天在看到《Java疯狂讲义》中一个章节习题:
开发一个工具类,该工具类提供一个eval()方法,实现JavaScript中eval()函数的功能——可以动态运行一行或多行程序代码。例如:eval("System.out.println("hello world")"),将输出hello world。
code:
import java.io.*;
/**
* Java创建一个类似于js中eval()的方法
*/
public class EvalUtil {
public static void main(String[] args) throws Exception {
eval("int a = c; int b = 2; System.out.println(a+b);");
}
public static void eval(String javaStr) throws Exception {
StringBuffer str = new StringBuffer();
str.append("public class Eval {").append("public static void main(String[] args) {").append(javaStr).append("}}");
OutputStream out = new FileOutputStream("Eval.java");
out.write(str.toString().getBytes("gbk"));
out.close();
// 编译时 错误信息
Process javacProcess = Runtime.getRuntime().exec("javac Eval.java");
InputStream compileError = javacProcess.getErrorStream();
System.err.println(read(compileError));
compileError.close();
Process javaProcess = Runtime.getRuntime().exec("java Eval");
//运行时 错误信息
InputStream err = javaProcess.getErrorStream();
System.err.println(read(err));
err.close();
//运行时 正常信息
InputStream success = javaProcess.getInputStream();
System.out.println(read(success));
success.close();
//删除生成文件
new File("Eval.java").delete();
new File("Eval.class").delete();
}
private static String read(InputStream in) throws IOException {
byte[] b = new byte[1024];
int len = -1;
StringBuffer str = new StringBuffer();
while ((len = in.read(b)) != -1) {
str.append(new String(b, 0, len, "gbk"));
}
return str.toString();
}
}
用Java开发一个工具类,提供似于js中eval函数功能的eval方法的更多相关文章
- java开发常用工具类
package com.rui.util; import java.text.DateFormat; import java.text.DecimalFormat; import java.text. ...
- Windows和Linux下 Java开发ping工具类
package com.test.util; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...
- 反射工具类.提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,被AOP过的真实类等工具函数.java
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.ap ...
- java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。
//------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...
- 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入。
package com.minxinloan.utils; import java.math.BigDecimal; public class Arith { // 源文件Arith.java: /* ...
- DbUtils是Apache出品一款简化JDBC开发的工具类
DbUtils - DbUtils是Apache出品一款简化JDBC开发的工具类 - 使用DbUtils可以让我们JDBC的开发更加简单 - DbUtils的使用: ...
- Java基础-DButils工具类(QueryRunner)详解
Java基础-DButils工具类(QueryRunner)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC ...
- java的Arrays工具类实战
java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的.静态方法是属于类的,不是属于类的对象.所以可以直接使用类名加方法名进行调用.Arrays作为一个工具类,能很好的操作数组 ...
- [改善Java代码]让工具类不可实例化
建议42: 让工具类不可实例化 Java项目中使用的工具类非常多,比如JDK自己的工具类java.lang.Math.java.util.Collections等都是我们经常用到的.工具类的方法和属性 ...
随机推荐
- Re.多项式求逆
前言 emmm暂无 多项式求逆目的 顾名思义 就是求出一个多项式的摸xn时的逆 给定一个多项式F(x),请求出一个多项式G(x),满足F(x)∗G(x)≡1(modxn),系数对998244353取模 ...
- Idea查看并过滤某个接口或者类的实现
查看当前类的父类 会出现一个图 不过这个有点鸡肋,我们通常想看一个类的实现有哪些,虽然有个方法可以,但是没有图. 查看类的实现 在你想查看的类上 Ctrl+H(Ctrl+Alt+B是直接弹窗,不能过滤 ...
- Apache的安装与配置
apahe官网 http://www.apache.org/ 安装及配置https://blog.csdn.net/liyang4534/article/details/78036591 常见问题的处 ...
- Django mysql应用
环境:python3.Django2 1.安装驱动mysqlclient pip3 install mysqlclient 2.创建一个数据库 CREATE DATABASE database_nam ...
- Python:Mac 下 MQTT 服务器 Mosquitto 的配置
我在Mac电脑上搭建时遇到了一些不同于网上大部分情况的问题,特此分享给可能也有遇到相同情况又找不到解决方法的人. 我的电脑系统:macOS Mojave 10.14.3. paho-mqtt 的安装 ...
- GDB调试技巧:总结篇
目录 一 写在开头 1.1 本文内容 二 学习资料 三 常用命令 四 调试技巧 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 写在开头 1.1 本文内容 总结GDB调试的一些常用命令和调试 ...
- request redirection
# encoding:utf-8 import reimport jsonimport randomfrom esdapi.config import BASE_URLfrom requests.se ...
- python flsak 框架
1.flask 轻量级微型web框架 优点:微框架.简单.可扩展 将flask变量实例化到app变量中 如果想要flask自动加载修改后的代码,要app.run(debug=True) 2.路由和视 ...
- Oracle 11g 服务启动/关闭 及 DB dump 导入
本地启动Oracle 服务脚本 由于本地机子安装了Oracle后,会自动启动一些默认的Oracle服务,这样子会导致机子比较慢.所以需要改成手动启动/关闭服务. 即用即开,不用就关. 开启的脚本: O ...
- P1972 [SDOI2009]HH的项链
洛谷的分块练习题 看到讨论中说分块莫队被卡就写了树状数组...(但感觉做法和莫队的思想有点像?) #include<bits/stdc++.h> using namespace std; ...