`

通过java反射简单实现ognl原理

    博客分类:
  • ognl
 
阅读更多

/*
 * 模拟实现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;
 }

 }

分享到:
评论

相关推荐

    ognl源码.rar

    2. **自省(Introspection)**:通过Java反射API,OGNL能动态查找和调用对象的方法,以及读写属性。 3. **列表和映射访问**:支持数组、列表、集合和映射的直接访问,例如`list[0]`或`map['key']`。 4. **方法调用...

    ognl-2.6.9-doc.zip

    `src`目录可能包含OGNL库的源代码,这对于深入理解其内部工作原理和实现细节非常有帮助。开发者可以通过阅读源码学习如何编写OGNL表达式解析器、上下文管理器等关键组件。 **6. 库依赖** `lib`目录下可能包含了OGNL...

    OGNL(jar包)源代码(OGNL表达式实现代码)

    本篇文章将深入探讨OGNL的原理、功能及其源代码实现。 首先,OGNL的核心特性在于其简洁而统一的语法,它允许开发者通过简单的表达式来访问和操作对象的属性。这种语法不仅包括字段的读写,还能执行方法调用,甚至...

    ognl2.6.11 源代码

    5. **查看OGNL与Java反射API的交互**:OGNL利用反射API来动态调用对象的方法和访问属性,这对于学习Java反射和动态类型编程很有价值。 6. **理解OGNL与各种框架的集成**:虽然OGNL是一个独立的库,但它常与其他框架...

    ognl-2.7.3-src

    OGNL 提供了对 Java 对象图的导航能力,使得你可以通过简单的字符串表达式来访问和修改对象的属性,甚至可以执行复杂的逻辑操作。 2. **源码结构分析** 源码包中的 `ognl` 文件夹包含了 OGNL 的所有核心组件,如...

    ognl源码 下载

    **ognl源码分析** ognl (Object-Graph Navigation Language) 是一个强大的表达式语言,主要用于在Java应用程序中获取和设置对象...此外,理解ognl源码也有助于你提升对Java反射、动态语言和表达式解析等领域的理解。

    ognl源代码(可以省去不少麻烦)

    **OGNL(Object-Graph Navigation Language)源代码...深入研究OGNL的源代码,不仅能提升对OGNL的理解,还能增强对Java反射、表达式语言设计以及性能优化等方面的认识。对于Java开发者来说,这是一份宝贵的学习资源。

    OGNL表达式源码

    本篇文章将深入探讨OGNL表达式的源码,通过一个简单的例子帮助你理解其工作原理。 首先,我们了解OGNL表达式的构成。OGNL表达式可以包含对象引用、属性访问、方法调用、索引操作、集合操作等多种元素。例如,`user....

    ognl的源码

    **ognl(Object-Graph Navigation Language)源码详解** OGNL,全称为Object-Graph Navigation Language,是一种强大的...同时,这也有助于提升对Java反射机制、动态语言特性的理解,以及设计和实现表达式语言的能力。

    ognl源码

    通过源码分析,我们可以深入理解OGNL的工作原理,这对于优化应用性能和解决可能出现的问题至关重要。 OGNL源码的学习主要包括以下几个核心概念: 1. **表达式解析**:OGNL的解析器将用户输入的表达式如`obj....

    struts2对Ognl的封装--PropertyAccessor

    Struts2是一个流行的Java web框架,它极大地简化了MVC(模型-视图-控制器)架构的实现。在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置对象的属性。"struts2对Ognl...

    ognl 源码zip

    OGNL (Object-Graph ...通过对OGNL源码的学习,你可以更深入地理解Java中的反射、动态代理等技术,并能够更好地利用OGNL解决实际问题,提升你的编程能力。同时,这也为理解和使用其他类似表达式语言提供了基础。

    ognl源码src文件

    **ognl源码解析** ognl(Object-Graph ...同时,这也有助于提高对Java反射、动态代理、表达式解析等技术的理解。在实际开发中,遇到ognl相关的问题时,可以直接查阅源码,定位问题,甚至进行性能优化或功能扩展。

    Struts2漏洞分析与研究之Ognl机制探讨1

    通过深入理解OGNL的工作原理,开发者可以更好地利用Struts2框架进行数据操作,同时也能更好地识别和防止Struts2框架中可能出现的安全漏洞,比如通过OGNL表达式注入攻击。在实际应用中,确保对OGNL表达式的正确过滤和...

    ognl-2.7.3

    8. **源代码分析**:通过查看源代码,我们可以学习到OGNL的实现细节,包括它的解析器、编译器、求值引擎等组件的设计与实现,这对理解表达式语言的原理非常有帮助。 9. **API使用**:了解OGNL的API接口,如`Value...

    OGNL笔记

    EL主要用于简单的属性访问和方法调用,而OGNL可以处理更复杂的情况,如链式调用、动态方法选择等。 ### OGNL优化与性能 由于OGNL的动态特性,它可能会带来一定的性能开销。在性能敏感的应用中,可能需要考虑优化,...

    java 面试宝典面试宝典

    Java面试宝典是Java开发者在求职过程中不可或缺的参考资料,它涵盖了Java编程语言的基础知识、进阶概念以及实际应用。这份面试宝典旨在帮助求职者全面准备Java相关的面试问题,提高成功获得理想职位的机会。 首先,...

    Struts2源码(xwork|asm|commons|freemark|ognl)

    开发者可以通过OGNL表达式直接访问Action的属性,或者在模板中进行条件判断和循环等操作。 了解Struts2的这些核心组件有助于深入理解其工作原理,对于框架的定制和优化具有重要意义。通过研究源码,开发者可以学习...

    Java表达式攻防下的黑魔法-release

    以`PageContextImpl.proprietaryEvaluate`方法为例,该方法内部会调用到`AstValue.getValue`方法,进而调用到`JasperELResolver.invoke`方法,最后通过反射机制调用到`Method.invoke`方法,实现了动态执行的过程。...

    JAVA软件工程课程体系

    Hibernate3对象关系映射、操纵持久化对象、Hibernate相关映射、Hibernate检索策略、Hibernate检索方式、Hibernate高级配置、Java语言的反射机制、iBATIS原理及使用;Spring2概述、bean和BeanFactory等。 通过上述...

Global site tag (gtag.js) - Google Analytics