/*
* 模拟实现ognl表达式
*/
public class MyOgnlValue {
// =========用迭代的方式解决多参数问题========================//
public static Object getValue(String exp, MyContext root) throws Exception {
if (exp == null || exp.length() == 0) {
throw new Exception("表达式为空!");
}
String[] express = exp.split("\\.");
if (express.length == 1) {
return root.get(express);
} else {
Object o = root.get(express[0]);
int i = 1;
while (express.length != i) {
o=getValue(express[i], o);
i++;
}
return o;
}
}
public static Object getValue(String exp, Object o) throws Exception {
String md="";
Object obj=null;
if(exp.indexOf("[")>0)
{
md="get"+exp.substring(0,1).toUpperCase()+exp.substring(1,exp.indexOf("["));
Method method=o.getClass().getMethod(md, new Class[]{});
obj= method.invoke(o, new Object[]{});
if(obj instanceof List)
{
int j=Integer.parseInt(exp.substring(exp.indexOf("[")+1,exp.indexOf("]")));
return ((List) obj).get(j);
}
else if(obj instanceof Map)
{
String key=exp.split("\'")[1];
return ((Map) obj).get(key);
}
else if(obj.getClass().getName().indexOf("[L")==0 || obj.getClass().isArray())
{
int j=Integer.parseInt(exp.substring(exp.indexOf("[")+1,exp.indexOf("]")));
return Array.get(obj, j);
}
}
else
{
md="get"+exp.substring(0,1).toUpperCase()+exp.substring(1);
Method method=o.getClass().getMethod(md, new Class[]{});
obj=method.invoke(o, new Object[]{});
return obj;
}
return obj;
}
}
分享到:
相关推荐
2. **自省(Introspection)**:通过Java反射API,OGNL能动态查找和调用对象的方法,以及读写属性。 3. **列表和映射访问**:支持数组、列表、集合和映射的直接访问,例如`list[0]`或`map['key']`。 4. **方法调用...
`src`目录可能包含OGNL库的源代码,这对于深入理解其内部工作原理和实现细节非常有帮助。开发者可以通过阅读源码学习如何编写OGNL表达式解析器、上下文管理器等关键组件。 **6. 库依赖** `lib`目录下可能包含了OGNL...
本篇文章将深入探讨OGNL的原理、功能及其源代码实现。 首先,OGNL的核心特性在于其简洁而统一的语法,它允许开发者通过简单的表达式来访问和操作对象的属性。这种语法不仅包括字段的读写,还能执行方法调用,甚至...
5. **查看OGNL与Java反射API的交互**:OGNL利用反射API来动态调用对象的方法和访问属性,这对于学习Java反射和动态类型编程很有价值。 6. **理解OGNL与各种框架的集成**:虽然OGNL是一个独立的库,但它常与其他框架...
OGNL 提供了对 Java 对象图的导航能力,使得你可以通过简单的字符串表达式来访问和修改对象的属性,甚至可以执行复杂的逻辑操作。 2. **源码结构分析** 源码包中的 `ognl` 文件夹包含了 OGNL 的所有核心组件,如...
**ognl源码分析** ognl (Object-Graph Navigation Language) 是一个强大的表达式语言,主要用于在Java应用程序中获取和设置对象...此外,理解ognl源码也有助于你提升对Java反射、动态语言和表达式解析等领域的理解。
**OGNL(Object-Graph Navigation Language)源代码...深入研究OGNL的源代码,不仅能提升对OGNL的理解,还能增强对Java反射、表达式语言设计以及性能优化等方面的认识。对于Java开发者来说,这是一份宝贵的学习资源。
本篇文章将深入探讨OGNL表达式的源码,通过一个简单的例子帮助你理解其工作原理。 首先,我们了解OGNL表达式的构成。OGNL表达式可以包含对象引用、属性访问、方法调用、索引操作、集合操作等多种元素。例如,`user....
**ognl(Object-Graph Navigation Language)源码详解** OGNL,全称为Object-Graph Navigation Language,是一种强大的...同时,这也有助于提升对Java反射机制、动态语言特性的理解,以及设计和实现表达式语言的能力。
通过源码分析,我们可以深入理解OGNL的工作原理,这对于优化应用性能和解决可能出现的问题至关重要。 OGNL源码的学习主要包括以下几个核心概念: 1. **表达式解析**:OGNL的解析器将用户输入的表达式如`obj....
Struts2是一个流行的Java web框架,它极大地简化了MVC(模型-视图-控制器)架构的实现。在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置对象的属性。"struts2对Ognl...
OGNL (Object-Graph ...通过对OGNL源码的学习,你可以更深入地理解Java中的反射、动态代理等技术,并能够更好地利用OGNL解决实际问题,提升你的编程能力。同时,这也为理解和使用其他类似表达式语言提供了基础。
**ognl源码解析** ognl(Object-Graph ...同时,这也有助于提高对Java反射、动态代理、表达式解析等技术的理解。在实际开发中,遇到ognl相关的问题时,可以直接查阅源码,定位问题,甚至进行性能优化或功能扩展。
通过深入理解OGNL的工作原理,开发者可以更好地利用Struts2框架进行数据操作,同时也能更好地识别和防止Struts2框架中可能出现的安全漏洞,比如通过OGNL表达式注入攻击。在实际应用中,确保对OGNL表达式的正确过滤和...
8. **源代码分析**:通过查看源代码,我们可以学习到OGNL的实现细节,包括它的解析器、编译器、求值引擎等组件的设计与实现,这对理解表达式语言的原理非常有帮助。 9. **API使用**:了解OGNL的API接口,如`Value...
EL主要用于简单的属性访问和方法调用,而OGNL可以处理更复杂的情况,如链式调用、动态方法选择等。 ### OGNL优化与性能 由于OGNL的动态特性,它可能会带来一定的性能开销。在性能敏感的应用中,可能需要考虑优化,...
Java面试宝典是Java开发者在求职过程中不可或缺的参考资料,它涵盖了Java编程语言的基础知识、进阶概念以及实际应用。这份面试宝典旨在帮助求职者全面准备Java相关的面试问题,提高成功获得理想职位的机会。 首先,...
开发者可以通过OGNL表达式直接访问Action的属性,或者在模板中进行条件判断和循环等操作。 了解Struts2的这些核心组件有助于深入理解其工作原理,对于框架的定制和优化具有重要意义。通过研究源码,开发者可以学习...
以`PageContextImpl.proprietaryEvaluate`方法为例,该方法内部会调用到`AstValue.getValue`方法,进而调用到`JasperELResolver.invoke`方法,最后通过反射机制调用到`Method.invoke`方法,实现了动态执行的过程。...
Hibernate3对象关系映射、操纵持久化对象、Hibernate相关映射、Hibernate检索策略、Hibernate检索方式、Hibernate高级配置、Java语言的反射机制、iBATIS原理及使用;Spring2概述、bean和BeanFactory等。 通过上述...