易截截图软件、单文件、免安装、纯绿色、仅160KB

动态执行Java脚本

1 背景
在我们的项目中,有时候在需要运行时获取一段脚本并执行其逻辑以灵活地实现业务需求。有人的第一想法就是脚本语言,我们当然可以在程序中内嵌一个Python解释器,然后在需要灵活变动的地方使用Python脚本实现我们的逻辑。但是这样做太“重量级”了,况且身为一个Java程序员,你不一定懂得Python的语法,又或者你忠于Java根本不愿把项目交托给其他语言。如果能够使用符合Java语法的脚本,而且不必嵌入任何解释器,那么这是不是一个完美的选择?
2 原理
Java本身具有足够的灵活性能让我们做到这一点,JVM可以在运行时动态编译Java源文件然后加载类,这是Java脚本动态获得生命力的基础。不过,动态编译的输入是一个完整的Java类的源文件,和javac工具一样,而我们要执行的仅仅是一段脚本。另外,这段Java脚本还需要有上下文环境,例如输入和输出,不然凭空写一段脚本没有任何意义,这就要费一番心思去设计了。要满足这些要求也不难,这里提供一个简单的实现方法,基本思路是生成一个临时类,将上下文变量声明为该类的成员,将脚本放在该类的excute()方法里,然后将这个临时类动态编译并执行excute()方法,即可使脚本生效。对于程序来说,动态编译的过程是透明的,其结果是准确获得了脚本的输出。
 
3 具体示例
3.1 需求描述
程序从数据库中取出了别名和姓名,而在界面上显示怎样的名字却不确定,因为这点会经常变动,有些场合显示别名和姓名的组合,有些场合仅显示姓名等等,为了适应这种灵活变化,需要将如何显示名称的逻辑作为一段脚本写在外部文件里,程序在运行时执行这段脚本得到名称然后显示。
3.2 解决过程
假设程序从数据库中取出了别名和姓名,分别存入变量
String alias = “万里独行”;
String name = “田伯光”;
 
并从外部文件读取了脚本内容
String script = “displayName = aliasName + ':' + originalName”;
从脚本里可以看到3个变量,分别是displayName、aliasName和originalName,这是我们默认提供给脚本的上下文变量环境,就像在Jsp页面里默认有request对象一样。
3.2.1 首先需要构造一个Java类的完整源代码
利用StringBuilder构造如下内容的字符串 String javaSource:
public class Temp
{
public String aliasName;
public String originalName;
public String displayName;
public void excute()
{
displayName = aliasNam


相关文档:

Java log编程规范(For log4j)

1 日志级别
oFATAL
记录影响系统正常运行,可能导致系统崩溃的事件
oERROR
记录影响业务流程正常进行,导致业务流程提前终止的事件
oWARN
记录未预料到,可能导致业务流程无法进行的事件
oINFO
记录系统启动/停止,模块加载/卸载之类事件
oDEBUG
记录业务详细流程,用户鉴权/业务流程选择/数据存取事件
oTRACE
......

Java异常设计方法

    前些时候,把《Thinking in Java》中异常这一章翻出来再次研读,本人有些收获,并且有些观点和作者观点不太一致,共享之
1.异常的定义
    一个系统中定义异常应遵循如下几个原则:
a. 系统中如果某个模块功能比较单一,建议将所有异常放在一个package内;如果某个模块有很多子模块, ......

java中字符类型的转换


1、如何将字符串String转化为整数int
  int i = Integer.parseInt(str);
  int i = Integer.valueOf(my_str).intValue();
   注: 字串转成Double, Float, Long的方法大同小异。
 
2、如何将字符串String转化为Integer
   Integer integer=Integer.valueOf(i)
3、如何将整数 ......

JAVA开发者最常去的20个英文网站


1.[http://www.javaalmanac.com] – Java开发者年鉴一书的在线版本. 要想快速查到某种Java技巧的用法及示例代码, 这是一个不错的去处.
2.[http://www.onjava.com] – O’Reilly的Java网站. 每周都有新文章.
3.[http://java.sun.com] – 官方的Java开发者网站 – 每周都有新文章发表.
4.[http ......

Java中计时器的使用

import java.util.Timer;
import java.util.TimerTask;
public class TimerExample
{
    /**
     * Java中计时器的使用
     * Time: 21:19 2010-1-5
     */
    Timer localTimer;
    public Ti ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号