`
xgbjmxn
  • 浏览: 269311 次
  • 性别: Icon_minigender_1
  • 来自: 新乡
社区版块
存档分类
最新评论

关于Java反射机制的一个实例

阅读更多
    *
      关于Java反射机制的一个实例
    * http://developer.51cto.com  2009-06-19 13:59  abruzzi  javaeye  我要评论(0)

      本文向您展示Java反射机制的一个实例,该实例持简单EL的taglib,基本上实现了多级bean的属性的访问。

      JSP的规范中,有个表达式语言(Expression Language, 简称EL),可以算是一个微型的语言,其中对request, page, session, application中预存的JavaBean对象的引用方式很是简单。最近正好需要写一个支持简单EL的taglib,所以就研究了下Java反射机制,目前基本上实现了多级bean的属性的访问,经测试,还是可以用的。如:

         1. public static void main(String[] args){ 
         2.     UserBean bean = new UserBean(); 
         3.     bean.setName("John Abruzzi"); 
         4.     bean.setNick("Abruzzi"); 
         5.     bean.setAge(24); 
         6.      
         7.     AddressBean addr = new AddressBean(); 
         8.     addr.setZip("0086"); 
         9.     addr.setStreet("Bell Street #12"); 
        10.     bean.setAddress(addr); 
        11.      
        12.     System.out.println(BeanParser.doParse(bean, "bean.address.street")); 
        13.     System.out.println(BeanParser.doParse(bean, "bean.address.zip")); 
        14.     System.out.println(BeanParser.doParse(bean, "bean.name")); 
        15.     System.out.println(BeanParser.doParse(bean, "bean.nick")); 
        16.     System.out.println(BeanParser.doParse(bean, "bean.age")); 
        17. }

      需要可以输出:

         1. Bell Street #12
         2. 0086
         3. John Abruzzi 
         4. Abruzzi 
         5. 24

      反射,即由一个抽象的对象(如Object),取出这个具体对象的属性或者方法(就EL中关于Bean的引用来说,这个定义已经够了)。在EL中,对一个Bean的某字段进行引用,只需 ${bean.field},当然,这个bean是已经被set到容器中的,这就是Java反射机制。

      我们从容器中取出以bean为名字的Object,通过Java反射机制知道它的真实类型,然后通过field以javabean规范拼出方法名,进行调用,如果这个表达式是多级的,如${bean.field.field},其中第一个field本身就是一个bean对象,同样需要递归的进行解析。

      大概原理就是这些了,看代码吧:

      现有一个UserBean, 其中的一个字段Address本身又是一个AddressBean。

         1. package elparser; 
         2. 
         3. public class AddressBean { 
         4.     private String street; 
         5.     private String zip; 
         6.      
         7.     public String getZip() { 
         8.         return zip; 
         9.     } 
        10. 
        11.     public void setZip(String zip) { 
        12.         this.zip = zip; 
        13.     } 
        14. 
        15.     public String getStreet() { 
        16.         return street; 
        17.     } 
        18. 
        19.     public void setStreet(String street) { 
        20.         this.street = street; 
        21.     } 
        22.      
        23. }

      然后是UserBean

         1. package elparser; 
         2. 
         3. public class UserBean { 
         4.     private String name; 
         5.     private String nick; 
         6.     private AddressBean address; 
         7.     private int age; 
         8.      
         9.     public int getAge(){ 
        10.         return this.age; 
        11.     } 
        12.      
        13.     public void setAge(int age){ 
        14.         this.age = age; 
        15.     } 
        16.      
        17.     public String getName() { 
        18.         return name; 
        19.     } 
        20.     public void setName(String name) { 
        21.         this.name = name; 
        22.     } 
        23.     public String getNick() { 
        24.         return nick; 
        25.     } 
        26.     public void setNick(String nick) { 
        27.         this.nick = nick; 
        28.     } 
        29.     public AddressBean getAddress() { 
        30.         return address; 
        31.     } 
        32.     public void setAddress(AddressBean address) { 
        33.         this.address = address; 
        34.     } 
        35. }

      Bean都是很简单的,考虑到对基本类型的支持,所以在UserBean中加入一个int型的字段age

      好了,看看怎么通过一个串和一个对象来取出其中的字段来:

         1. package elparser; 
         2. 
         3. import java.lang.reflect.Method; 
         4. 
         5. public class BeanParser { 
         6.      
         7.     private static String getMethodName(String property, String prefix){ 
         8.         String prop = Character.toUpperCase(property.charAt(0))+property.substring(1); 
         9.      
        10.         String methodName = prefix + prop; 
        11.      
        12.         return methodName; 
        13.     } 
        14.      
        15.     private static Object parse(Object bean, String expr){ 
        16.         Class beanClass = bean.getClass(); 
        17.          
        18.         Method method = null; 
        19.         Object result = null; 
        20.          
        21.         try{ 
        22.             //这两步是关键,get方法不需要传入参数,所以只是new出两个空数组传入 
        23.             method = beanClass.getMethod(getMethodName(expr, "get"), new Class[]{}); 
        24.             result = method.invoke(bean, new Object[]{}); 
        25.         }catch(Exception e){ 
        26.             System.out.println(e.getMessage()); 
        27.         } 
        28.          
        29.         return result; 
        30.     } 
        31.      
        32.     public static Object doParse(Object bean, String expr){ 
        33.         String keys[] = expr.split("\\."); 
        34.          
        35.         Object obj = null; 
        36.          
        37.         for(int i = 1; i < keys.length;i++){ 
        38.             obj = parse(bean, keys[i]); 
        39.             bean = obj; 
        40.         }//递归parse 
        41.          
        42.         return obj; 
        43.     } 
        44.      
        45.     public static void main(String[] args){ 
        46.         UserBean bean = new UserBean(); 
        47.         bean.setName("John Abruzzi"); 
        48.         bean.setNick("Abruzzi"); 
        49.         bean.setAge(24); 
        50.          
        51.         AddressBean addr = new AddressBean(); 
        52.         addr.setZip("0086"); 
        53.         addr.setStreet("Bell Street #12"); 
        54.         bean.setAddress(addr); 
        55.          
        56.         System.out.println(BeanParser.doParse(bean, "bean.address.street")); 
        57.         System.out.println(BeanParser.doParse(bean, "bean.address.zip")); 
        58.         System.out.println(BeanParser.doParse(bean, "bean.name")); 
        59.         System.out.println(BeanParser.doParse(bean, "bean.nick")); 
        60.         System.out.println(BeanParser.doParse(bean, "bean.age")); 
        61.     } 
        62. }

      代码比较简短,重要部分有注释,应该很容易理解。当然这篇文章主要是关于Java的反射机制,如果需要对EL完全支持,可以使用JavaCC做一个简单的分析器(Apache的commons中包含一个el的项目,就是用javacc写的分析器)。

      【编辑推荐】
         1. 在Java应用程序中使用Jfreechart配置
         2. Java程序员学习Flex和BlazeDS的十三个理由
         3. 用JavaFX编写用户界面控制器
         4. Java WEB开发中的中文乱码问题解决
         5. 总结Java Web中几个函数的作用
      【责任编辑:red7 TEL:(010)68476606】
分享到:
评论

相关推荐

    Java 反射机制 代码的实例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...

    Java反射机制总结(实例分析)

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...

    反射实例-JAVA反射机制

    下面通过一个简单的示例来展示Java反射机制的工作流程: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try { Class c = Class.forName(args[0])...

    Java反射机制 Java反射机制

    Java反射机制是Java语言的一个重要特性,它允许程序在运行时获取类的信息并操作对象。Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用类的方法等。通过反射,程序可以动态地创建对象和调用...

    Java反射机制的详细讲解及实例,有助于java深度开发

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这一机制对于理解和利用Java的动态性至关重要,尤其是在进行复杂系统设计、框架开发以及元数据驱动的应用中...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    反射实例-JAVA反射机制.doc

    Java 反射机制详解 Java 反射机制是 Java 语言提供的一种强大的工具,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并进行操作。这种能力使得 Java 应用程序更加灵活,能够在运行时发现和修改自身...

    java的反射机制的应用实例

    以下是对Java反射机制应用实例的详细解释: 1. **获取类信息**:使用`Class`类的`forName()`方法可以获取到任何类的`Class`对象,例如`Class&lt;?&gt; clazz = Class.forName("全限定类名");`。这样我们就能获取到该类的...

    一个例子让你了解Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...

    通过Java反射机制获取JavaBean对象

    1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息

    Java反射机制总结

    ### Java反射机制总结 ...总之,Java反射机制是Java语言的一个重要特性,它提供了在运行时动态获取类信息和操作类结构的能力。合理使用反射可以提高程序的灵活性和扩展性,但在使用时也需要考虑到其潜在的问题和限制。

    java反射机制实例

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个实例将深入探讨Java反射机制的使用,通过具体代码示例来阐述其工作原理和应用。 在Java中...

    java 反射机制详解

    Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    Java反射机制Demo

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。...

    java反射经典实例

    通过上述实例,我们可以看到Java反射机制在许多实际场景中的应用,它扩展了Java代码的灵活性和可扩展性。然而,也应注意,过度使用反射可能会引入复杂性和潜在的安全风险,因此在设计和实现时需权衡利弊。在理解了...

    Java反射机制学习(二)

    Java反射机制允许程序在运行时获取关于类、接口、字段和方法的信息,并且能够动态地调用方法和修改字段值。这极大地增强了代码的灵活性和可扩展性。 2. **Class类**: 所有的Java类都隐式地继承自java.lang.Class...

    java反射机制详解

    5. **通过反射机制实例化一个类的对象**: ```java Object obj = clazz.newInstance(); ``` 6. **获取某个类的全部属性**: ```java Field[] fields = clazz.getDeclaredFields(); for (Field field : ...

Global site tag (gtag.js) - Google Analytics