admin 管理员组

文章数量: 1184232


2024年3月30日发(作者:为什么说php世界第一)

Word文档

Java中的动态代码编程

Java中的动态代码编程

其实是一个带有语法含义的字符串,整个字符串将规定操作的类型和内容。OGNL

表达式支持大量 Expression,如"链式访问对象'、表达式计算、甚至还支持Lambda

表达式。

Java不是解决动态层问题的理想语言,这些动态层问题包

括原型设计、脚本处理等。

公司的项目主要基于Java平台,在实践中觉察主要有两种方式可以实现:

统一表达式语言

动态语言,如Groovy

JUEL(Java 统一表达式语言)

Java*统一表达式语言(英语:Unified Expression Language,简称JUEL*)是一种

特殊用途的编程语言,主要在Java Web应用程序用于将表达式嵌入到web页面。

Java规范制定者和Java Web领域技术专家小组制定了统一的表达式语言。JUEL

最初包含在JSP 2.1规范JSR-245中,后来成为Java EE 7的一部分,改在JSR-341

中定义。

主要的开源实现有:OGNL ,MVEL ,SpEL ,JUEL ,Java Expression Language

(JEXL) ,JEval,Jakarta JXPath 等。这里主要介绍在实践中使用较多的MVEL、OGNL

和SpEL。

OGNL(Object Graph Navigation Library)

在Struts 2 的标签库中都是使用OGNL表达式访问ApplicationContext中的对

象数据,OGNL主要有三个重要因素:

Expression

Expression是整个OGNL的核心内容,全部的OGNL操作都是针对表达式解

析后进行的。通过Expression来告知OGNL操作到 底要干些什么。因此,Expression

Root对象:

OGNL的Root对象可以理解为OGNL的操作对象。当我们指定了一个表达式

的时候,我们需要指定这个表达式针对的是哪个具体的对象。而 这个具体的对

象就是Root对象,这就意味着,假如有一个OGNL表达式,那么我们需要针对

Root对象来进行OGNL表达式的计算并且返回结果。

ApplicationContext

有个Root对象和Expression,我们就可以使用OGNL进行简洁的操作了,如

对Root对象的赋值与取值操作。但是,事实上在OGNL的 内部,全部的操作都

会在一个特定的数据环境中运行。这个数据环境就是ApplicationContext(上下文环

境)。OGNL的上下文环境是一个 Map结构,称之为OgnlContext。Root对象也会

被添加到上下文环境当中去。

Foo foo = new Foo();e(test);Map context = new

HashMap();(foo,foo);String expression = == test;try {实现方式

耗时〔MS) context = new HashMap();

Integer result = 0;

Date start = new Date();

for (int xval = 0; xval xmax; xval++) {

for (int yval = 0; yval ymax; yval++) {

for (int zval = 0; zval = zmax; zval++) {

1 / 4

Word文档

(x, xval);

(y, yval);

(z, zval);

Integer cal = (Integer) ue(expression, context);

result += cal;

}

}

}

Date end = new Date();

n(Ognl:time is : + (e() - e()) + ,result is

+ result);

}

public static void runMvel(int xmax, int ymax, int zmax) {

Map context = new HashMap();

String expression = x + y*2 - z;

Serializable compileExpression = eExpression(expression);

Integer result = 0;

Date start = new Date();

for (int xval = 0; xval xmax; xval++) {

for (int yval = 0; yval ymax; yval++) {

for (int zval = 0; zval = zmax; zval++) {

(x, xval);

(y, yval);

(z, zval);

VariableResolverFactory functionFactory = new

MapVariableResolverFactory(context);

Integer cal = (Integer) eExpression(compileExpression, context,

functionFactory);

result += cal;

}

}

}

Date end = new Date();

n(MVEL:time is : + (e() - e()) + ,result

is + result);

}

public static void runSpel(int xmax, int ymax, int zmax) {

SpelParserConfiguration config;

ExpressionParser parser;

config = new SpelParserConfiguration(ATE,

ssLoader());

parser = new SpelExpressionParser(config);

StandardEvaluationContext context = new StandardEvaluationContext();

Integer result = 0;

2 / 4

Word文档

String expressionStr = #x + #y*2 - #z;

Date start = new Date();

for (Integer xval = 0; xval xmax; xval++) {

for (Integer yval = 0; yval ymax; yval++) {

for (Integer zval = 0; zval = zmax; zval++) {

iable(x, xval);

iable(y, yval);

iable(z, zval);

Expression expression = xpression(expressionStr);

Integer cal = ue(context, );

result += cal;

}

}

}

Date end = new Date();

n(SpEL:time is : + (e() - e()) + ,result is

+ result);

}

public static void runGroovyClass(int xmax, int ymax, int zmax) {

GroovyClassLoader loader = new GroovyClassLoader();

Class groovyClass = null;

try {

groovyClass = lass(new File(

));

} catch (IOException e) {

tackTrace();

}

GroovyObject groovyObject = null;

try {

groovyObject = (GroovyObject) tance();

} catch (InstantiationException e) {

tackTrace();

} catch (IllegalAccessException e) {

tackTrace();

}

Integer result = 0;

Date start = new Date();

for (int xval = 0; xval xmax; xval++) {

for (int yval = 0; yval ymax; yval++) {

for (int zval = 0; zval = zmax; zval++) {

Object[] args = {xval,yval,zval};

Integer cal = (Integer) Method(cal, args);

result += cal;

}

3 / 4

Word文档

}

}

Date end = new Date();

n(Groovy Class:time is : + (e() - e())

+ ,result is + result);

}}

4 / 4


本文标签: 表达式 操作 对象 语言 动态