Java中的动态代码编程
Java中的动态代码编程
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)
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其实是一个带有语法含义的字符串,整个字符串将规定操作的类型和内容。OGNL表达式支持大量 Expression,如"链式访问对象'、表达式计算、甚至还支持Lambda表达式。
Root对象:
OGNL的Root对象可以理解为OGNL的操作对象。当我们指定了一个表达式的时候,我们需要指定这个表达式针对的是哪个具体的对象。而 这个具体的对象就是Root对象,这就意味着,假如有一个OGNL表达式,那么我们需要针对Root对象来进行OGNL表达式的计算并且返回结果。
ApplicationContext
有个Root对象和Expression,我们就可以使用OGNL进行简洁的操作了,如对Root对象的赋值与取值操作。但是,事实上在OGNL的 内部,全部的操作都会在一个特定的数据环
Expression
Expression是整个OGNL的核心内容,全部的OGNL操作都是针对表达式解析后进行的。通过Expression来告知OGNL操作到 底要干些什么。因此,Expression其实是一个带有语法含义的字符串,整个字符串将规定操作的类型和内容。OGNL表达式支持大量 Expression,如"链式访问对象'、表达式计算、甚至还支持Lambda表达式。
Root对象:
OGNL的Root对象可以理解为OGNL的操作对象。当我们指定了一个表达式的时候,我们需要指定这个表达式针对的是哪个具体的对象。而 这个具体的对象就是Root对象,这就意味着,假如有一个OGNL表达式,那么我们需要针对Root对象来进行OGNL表达式的计算并且返回结果。
ApplicationContext
有个Root对象和Expression,我们就可以使用OGNL进行简洁的操作了,如对Root对象的赋值与取值操作。但是,事实上在OGNL的 内部,全部的操作都会在一个特定的数据环
境中运行。这个数据环境就是ApplicationContext(上下文环境)。OGNL的上下文环境是一个 Map结构,称之为OgnlContext。Root对象也会被添加到上下文环境当中去。
Foo foo = new Foo();foo.setName(test);Map context = new HashMap();context.put(foo,foo);String expression = foo.name == 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++) {
context.put(x, xval);
context.put(y, yval);
context.put(z, zval);
Integer cal = (Integer) Value(expression, context);
result += cal;
Foo foo = new Foo();foo.setName(test);Map context = new HashMap();context.put(foo,foo);String expression = foo.name == 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++) {
context.put(x, xval);
context.put(y, yval);
context.put(z, zval);
Integer cal = (Integer) Value(expression, context);
result += cal;
}
}
}
Date end = new Date();
System.out.println(Ognl:time is : + (Time() - Time()) + ,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 = MVELpileExpression(expression);
Integer result = 0;
Date start = new Date();
for (int xval = 0; xval xmax; xval++) {
for (int yval = 0; yval ymax; yval++) {
}
}
Date end = new Date();
System.out.println(Ognl:time is : + (Time() - Time()) + ,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 = MVELpileExpression(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++) {
context.put(x, xval);
context.put(y, yval);
context.put(z, zval);
VariableResolverFactory functionFactory = new MapVariableResolverFactory(context);
Integer cal = (Integer) uteExpression(compileExpression, context, functionFactory);
厉害的编程代码 result += cal;
}
}
}
Date end = new Date();
System.out.println(MVEL:time is : + (Time() - Time()) + ,result is + result);
}
context.put(x, xval);
context.put(y, yval);
context.put(z, zval);
VariableResolverFactory functionFactory = new MapVariableResolverFactory(context);
Integer cal = (Integer) uteExpression(compileExpression, context, functionFactory);
厉害的编程代码 result += cal;
}
}
}
Date end = new Date();
System.out.println(MVEL:time is : + (Time() - Time()) + ,result is + result);
}
public static void runSpel(int xmax, int ymax, int zmax) {
SpelParserConfiguration config;
ExpressionParser parser;
config = new SpelParserConfiguration(SpelCompilerMode.IMMEDIATE, ClassLoader());
parser = new SpelExpressionParser(config);
StandardEvaluationContext context = new StandardEvaluationContext();
Integer result = 0;
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++) {
context.setVariable(x, xval);
context.setVariable(y, yval);
SpelParserConfiguration config;
ExpressionParser parser;
config = new SpelParserConfiguration(SpelCompilerMode.IMMEDIATE, ClassLoader());
parser = new SpelExpressionParser(config);
StandardEvaluationContext context = new StandardEvaluationContext();
Integer result = 0;
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++) {
context.setVariable(x, xval);
context.setVariable(y, yval);
context.setVariable(z, zval);
Expression expression = parser.parseExpression(expressionStr);
Integer cal = Value(context, Integer.class);
result += cal;
}
}
}
Date end = new Date();
System.out.println(SpEL:time is : + (Time() - Time()) + ,result is + result);
}
public static void runGroovyClass(int xmax, int ymax, int zmax) {
GroovyClassLoader loader = new GroovyClassLoader();
Class groovyClass = null;
try {
Expression expression = parser.parseExpression(expressionStr);
Integer cal = Value(context, Integer.class);
result += cal;
}
}
}
Date end = new Date();
System.out.println(SpEL:time is : + (Time() - Time()) + ,result is + result);
}
public static void runGroovyClass(int xmax, int ymax, int zmax) {
GroovyClassLoader loader = new GroovyClassLoader();
Class groovyClass = null;
try {
groovyClass = loader.parseClass(new File(
vy));
} catch (IOException e) {
e.printStackTrace();
}
GroovyObject groovyObject = null;
try {
groovyObject = (GroovyObject) wInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
Integer result = 0;
Date start = new Date();
vy));
} catch (IOException e) {
e.printStackTrace();
}
GroovyObject groovyObject = null;
try {
groovyObject = (GroovyObject) wInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
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) groovyObject.invokeMethod(cal, args);
result += cal;
}
}
}
Date end = new Date();
System.out.println(Groovy Class:time is : + (Time() - Time()) + ,result is + result);
}}
for (int yval = 0; yval ymax; yval++) {
for (int zval = 0; zval = zmax; zval++) {
Object[] args = {xval,yval,zval};
Integer cal = (Integer) groovyObject.invokeMethod(cal, args);
result += cal;
}
}
}
Date end = new Date();
System.out.println(Groovy Class:time is : + (Time() - Time()) + ,result is + result);
}}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论