mvel 调用java_Mvel使用指南

mvel 调用java_Mvel使用指南mvel 的执行方式分为两种 一种解释执行和编译执行 解释模式是一个无状态的 动态解释执行 不像编译模式需要负载表达式 他不需要就可以执行相应的脚本 编译模式需要在缓存中产生一个完全规范化表达式之后再执行 表达式通常被称为 speed sensitive 应用 第二个选项可能会更好 Dependencies 要使用 mvel 只需要一个 mvel jar 即可 TheMVELConve 为

mvel的执行方式分为两种:一种解释执行和编译执行.解释模式是一个无状态的,动态解释执行。不像编译模式需要负载表达式,他不需要就可以执行相应的脚本。编译模式需要在缓存中产生一个完全规范化表达式之后再执行.表达式通常被称为speed-sensitive应用,第二个选项可能会更好。

Dependencies

要使用mvel只需要一个mvel.jar即可

The MVEL Convenience Class

为了使得使用简单和直接,mvel大部分的接口使用了静态方法,使得你在应用程序中可以直接使用

几乎所有的交互将围绕org.mvel2.MVEL类的使用。

Interpreted Mode

正如本节所介绍,解释模式是一种快速、动态parser-interpreterMVEL,所谓的快是,指的是相比一些其他的EL实现.

调用解释器主要集中在MVEL类中的eval()方法。

Integration Example: MVELTest.java

import org.mvel.MVEL; public class MVELTest { public static void main(String[]args) { String expression =”foobar > 99″; Map vars = new HashMap(); vars.put(“foobar”,new Integer(100)); // We know this expressionshould return a boolean. Boolean result = (Boolean)MVEL.eval(expression, vars); if (result.booleanValue()) { System.out.println(“Itworks!”); } } }

Compiled Mode

编译和执行一个表达式,需要做的不是简单地调用一个方法。它包括两种方法!

Integration Example: MVELTest2.java

import org.mvel.MVEL;

public class MVELTest2 {

public static void main(String[]args) {

String expression =”foobar > 99″;

// Compile the expression.

Serializable compiled =MVEL.compileExpression(expression);

Map vars = new HashMap();

vars.put(“foobar”,new Integer(100));

// Now we execute it.

Boolean result = (Boolean)MVEL.executeExpression(compiled, vars);

if (result.booleanValue()) {

System.out.println(“Itworks!”);

}

}

}

在MVEL2.0,您可以将编译器设置为强类型模式,这样类型转换会在脚本内部进行转换.这意味着必须告知编译器注入任何类型的变量。这也意味编译器可以在编译时告知返回类型。

Turning on StrongTyping

调用ParserContext的启动接口:setStrongTyping

// create new parser context

ParserContext ctx = newParserContext();

// turn on strong typing

ctx.setStrongTyping(true);

//compile an expression’str.toUpperCase()’

String expression =”str.toUpperCase()”;

CompiledExpression ce =MVEL.compileExpression(expression, ctx);

运行上面的代码会报错

[Error: Failed to compile: 2 compilation error(s):

– (1,3) unqualified type in strict mode for: str

– (1,17) unable to resolve method using strict-mode: java.lang.Object.toUpperCase(…)]

这是因为我们没有设置强制转换的类型,

// create new parser context

ParserContext ctx = new ParserContext();

// turn on strong typing

ctx.setStrongTyping(true);

// declare the type of ‘str’

ctx.addInput(“str”, String.class);

//compile an expression ‘str.toUpperCase()’

String expression = “str.toUpperCase()”;

CompiledExpression ce = MVEL.compileExpression(expression, ctx);

我们还可以通过CompiledExpression 对象的getEgressType()方法来确定返回的对象类型:

Class returnType = ce.getKnownEgressType(); // returns java.lang.String in this case.

MVEL还可以指定生产类型的类型参数,比如:

ParserContext ctx = new ParserContext();

ctx.setStrongTyping(true);

// Specify the type of “foo” and it’s type parameters.

ctx.addInput(“foo”, HashMap.class, new Class[]{String.class, String.class});

String expression = “foo.get(‘bar’).toUpperCase()”;

Serializable ce = MVEL.compileExpression(expression, ctx);

在这种情况下,该表达式可以编译成功并执行,因为MVEL能够确定foo.get的返回类型根据输入的时候被指定的类型参数。

1.  Optimizers

优化器通常只使用于编译模式,而不考虑在eval解释模式下.

由于MVEL是动态运行时的动态语言,所以需要通过反射的对象让脚本访问字段和方法。但这严重影响性能,MVEL配备优化,为了最大限度地减少或消除反射调用的开销。默认情况下,MVEL有两个默认优化:反射优化器,ASM字节码优化器。

反射优化器

反射优化器在一些api中也被称为SAFE_REFLECTIVE优化器,表示他是绝对安全的,不会对类加载造成影响,保证兼容所有的语言结构.ASM优化器可能会在某些情况下,由于各种原因不能被编译成字节码,对于某些操作会依靠这个优化器。

优化器的配置可以通过MVELsOptimizerFactory进行配置:

OptimizerFactory.setDefaultOptimizer(“reflective”);

The ASM (Bytecode) Optimizer

ASM字节码优化器在MVEL是默认启用。它使用一个内联版本的ASM3.0字节码操作库产生编译反射访问器存根用于反射调用的地方。优化器是由默认使用API调用如下:

OptimizerFactory.setDefaultOptimizer(“ASM”);

2.   Programmatic Imports for 2.0

默认情况下,如java中,mvel自动将所有java.lang.* 预加载到了运行执行环境中去.同时,MVEL能够以编程方式导入单个类,整个包,甚至是静态方法.

这样看来好像有点偏离了MEVL这个类,但是这个没有太大关系.

Importing Classes

看下面代码:

// where someExpression is a String or char[] of the expression to be compiled.

ParserContext context = new ParserContext();

context.addImport(“Message”, Message.class);

context.addImport(“MessageFactory”, MessageFactory.class);

Serializable compiled = MVEL.compileExpression(someExpression, context); // compile the expresion

上面的例子中我们为运行时添加了两个自定义的类型,他们都使用了原来的名称,但事实上你可以修改成任意合法的名称.比如:

context.addImport(“Utils”, ScriptUtilities.class);

Importing Packages

导入包:

ParserContext ctx = new ParserContext();

ctx.addPackageImport(“java.util”); // imports the entire java.util.* package.

Serializable s = MVEL.compileExpression(“map = new HashMap();”, ctx);

Importing Static Methods

ParserContext ctx = new ParserContext();

try {

ctx.addImport(“time”, System.class.getMethod(“currentTimeMillis”));

}

catch (NoSuchMethodException e) {

// handle exception here.

}

Serializable s = MVEL.compileExpression(“time();” ctx);

3.   自定义变量解析器

4.   自定义属性处理程序

略…见java doc文档

5.  类型转换

略..

6.  行调试器接口

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207615.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午1:28
下一篇 2026年3月19日 下午1:28


相关推荐

  • Unity 接入 ILRuntime 热更方案

    Unity 接入 ILRuntime 热更方案引言最近看了一下 ET 框架 本来只是研究一下网络模块 后来抽时间看一下热更框架 ET 的热更使用的不是像 tolua 这样基于 Lua 的方案 而是基于 ILRuntime 的纯 C 热更实现方案 ILRuntime 的实现原理对 Unity 引擎有一定了解的开发者都应该知道 Unity 支持使用 C 做脚本语言 是依赖 Mono 引擎运行 C 编译后的 IL 中间语言

    2026年3月18日
    1
  • 解决哈希冲突(四种方法)[通俗易懂]

    解决哈希冲突(四种方法)[通俗易懂]一、了解哈希表及哈希冲突哈希表:是一种实现关联数组抽象数据类型的数据结构,这种结构可以将关键码映射到给定值。简单来说哈希表(key-value)之间存在一个映射关系,是键值对的关系,一个键对应一个值。哈希冲突:当两个不同的数经过哈希函数计算后得到了同一个结果,即他们会被映射到哈希表的同一个位置时,即称为发生了哈希冲突。简单来说就是哈希函数算出来的地址被别的元素占用了。二、解决哈希冲突办法1、开放定址法:我们在遇到哈希冲突时,去寻找一个新的空闲的哈希地址。举例:就是当我们去教室上课..

    2022年6月17日
    30
  • h5标签上实现文字空格

    h5标签上实现文字空格在 vue 项目中实现文字之间的空格 divclass top pclass groupLeader 组 xa0 xa0 xa0 长 span click commonClick leader xxx pclass standingGrou 副组长 span x span pclass standingGrou span click commonClick leader pclass groupLeader divclass top

    2026年3月19日
    2
  • Idea激活码最新教程2023.1.5版本,永久有效激活码,亲测可用,记得收藏

    Idea激活码最新教程2023.1.5版本,永久有效激活码,亲测可用,记得收藏Idea 激活码教程永久有效 2023 1 5 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2023 1 5 成功激活

    2025年5月26日
    4
  • unsafe java_浅析 Unsafe 的使用

    unsafe java_浅析 Unsafe 的使用零前期准备 0 版本 JDK 版本 OpenJDK11 0 1IDE idea2018 31Unsafe 简介 Unsafe 是 java 留给开发者的后门 用于直接操作系统内存且不受 jvm 管辖 实现类似 C 风格的操作 Oracle 官方一般不建议开发者使用 Unsafe 类 因为正如这个类的类名一样 它并不安全 使用不当会造成内存泄露 在平时的业务开发中 这个类基本是不会有接

    2026年3月7日
    3
  • Spring Boot 中的异步调用[通俗易懂]

    Spring Boot 中的异步调用[通俗易懂]SpringBoot中的异步调用通常我们开发的程序都是同步调用的,即程序按照代码的顺序一行一行的逐步往下执行,每一行代码都必须等待上一行代码执行完毕才能开始执行。而异步编程则没有这个限制,代码的调用不再是阻塞的。所以在一些情景下,通过异步编程可以提高效率,提升接口的吞吐量。这节将介绍如何在SpringBoot中进行异步编程。要开启异步支持,首先得在SpringBoot入口类上加上@EnableAsync注解:@SpringBootApplication@EnableAsyncpublic

    2022年7月11日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号