`
chenqqabcd
  • 浏览: 5499 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

1.Java反射经典实例 Java Reflection

阅读更多
引用
Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。


1. 得到某个对象的属性
public Object getProperty(Object owner, String fieldName) throws Exception {      
    Class ownerClass = owner.getClass();                                          
                                                                                  
    Field field = ownerClass.getField(fieldName);                                 
                                                                                  
    Object property = field.get(owner);                                           
                                                                                  
    return property;                                                              
}     
       
Class ownerClass = owner.getClass():得到该对象的Class。

Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。

Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。 
   
2. 得到某个类的静态属性
public Object getStaticProperty(String className, String fieldName)    
            throws Exception {                                         
    Class ownerClass = Class.forName(className);                       
                                                                       
    Field field = ownerClass.getField(fieldName);                      
                                                                       
    Object property = field.get(ownerClass);                           
                                                                       
    return property;                                                   
}    


Class ownerClass = Class.forName(className) :首先得到这个类的Class。

Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。

Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。


3. 执行某对象的方法


    public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {   
        Class ownerClass = owner.getClass();   
        Class[] argsClass = new Class[args.length];   
        for (int i = 0, j = args.length; i < j; i++) {   
            argsClass[i] = args[i].getClass();   
        }    
        Method method = ownerClass.getMethod(methodName, argsClass);      
        return method.invoke(owner, args);    
    }  


Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。

3~6行:配置参数的Class数组,作为寻找Method的条件。

Method method = ownerClass.getMethod(methodName, argsClass):通过Method名和参数的Class数组得到要执行的Method。

method.invoke(owner, args):执行该Method,invoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值。


4. 执行某个类的静态方法

public Object invokeStaticMethod(String className, String methodName,            
            Object[] args) throws Exception {                                    
    Class ownerClass = Class.forName(className);                                 
                                                                                 
    Class[] argsClass = new Class[args.length];                                  
                                                                                 
    for (int i = 0, j = args.length; i < j; i++) {                               
        argsClass[i] = args[i].getClass();                                       
    }                                                                            
                                                                                 
    Method method = ownerClass.getMethod(methodName, argsClass);                 
                                                                                 
    return method.invoke(null, args);                                            
}   

基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。 
5. 新建实例
public Object newInstance(String className, Object[] args) throws Exception {    
    Class newoneClass = Class.forName(className);                                
                                                                                 
    Class[] argsClass = new Class[args.length];                                  
                                                                                 
    for (int i = 0, j = args.length; i < j; i++) {                               
        argsClass[i] = args[i].getClass();                                       
    }                                                                            
                                                                                 
    Constructor cons = newoneClass.getConstructor(argsClass);                    
                                                                                 
    return cons.newInstance(args);                                               
   

这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。

Class newoneClass = Class.forName(className):第一步,得到要构造的实例的Class。

第6~第10行:得到参数的Class数组。

Constructor cons = newoneClass.getConstructor(argsClass):得到构造子。

cons.newInstance(args):新建实例。

6. 判断是否为某个类的实例
public boolean isInstance(Object obj, Class cls) {        
    return cls.isInstance(obj);                           
}     

7. 得到数组中的某个元素
public Object getByArray(Object array, int index) {       
    return Array.get(array,index);                        
}    


附完整源码:


    import java.lang.reflect.Array;   
    import java.lang.reflect.Constructor;   
    import java.lang.reflect.Field;   
    import java.lang.reflect.Method;   
      
      
    /**  
     * Java Reflection Cookbook  
     *  
     * @author Michael Lee  
     * @since 2006-8-23  
     * @version 0.1a  
     */  
      
    public class Reflection {   
        /**  
         * 得到某个对象的公共属性  
         *  
         * @param owner, fieldName  
         * @return 该属性对象  
         * @throws Exception  
         *  
         */  
        public Object getProperty(Object owner, String fieldName) throws Exception {   
            Class ownerClass = owner.getClass();   
      
            Field field = ownerClass.getField(fieldName);   
      
            Object property = field.get(owner);   
      
            return property;   
        }   
      
        /**  
         * 得到某类的静态公共属性  
         *  
         * @param className   类名  
         * @param fieldName   属性名  
         * @return 该属性对象  
         * @throws Exception  
         */  
        public Object getStaticProperty(String className, String fieldName)   
                throws Exception {   
            Class ownerClass = Class.forName(className);   
      
            Field field = ownerClass.getField(fieldName);   
      
            Object property = field.get(ownerClass);   
      
            return property;   
        }   
      
      
        /**  
         * 执行某对象方法  
         *  
         * @param owner  
         *            对象  
         * @param methodName  
         *            方法名  
         * @param args  
         *            参数  
         * @return 方法返回值  
         * @throws Exception  
         */  
        public Object invokeMethod(Object owner, String methodName, Object[] args)   
                throws Exception {   
      
            Class ownerClass = owner.getClass();   
      
            Class[] argsClass = new Class[args.length];   
      
            for (int i = 0, j = args.length; i < j; i++) {   
                argsClass[i] = args[i].getClass();   
            }   
      
            Method method = ownerClass.getMethod(methodName, argsClass);   
      
            return method.invoke(owner, args);   
        }   
      
      
          /**  
         * 执行某类的静态方法  
         *  
         * @param className  
         *            类名  
         * @param methodName  
         *            方法名  
         * @param args  
         *            参数数组  
         * @return 执行方法返回的结果  
         * @throws Exception  
         */  
        public Object invokeStaticMethod(String className, String methodName,   
                Object[] args) throws Exception {   
            Class ownerClass = Class.forName(className);   
      
            Class[] argsClass = new Class[args.length];   
      
            for (int i = 0, j = args.length; i < j; i++) {   
                argsClass[i] = args[i].getClass();   
            }   
      
            Method method = ownerClass.getMethod(methodName, argsClass);   
      
            return method.invoke(null, args);   
        }   
      
      
      
        /**  
         * 新建实例  
         *  
         * @param className  
         *            类名  
         * @param args  
         *            构造函数的参数  
         * @return 新建的实例  
         * @throws Exception  
         */  
        public Object newInstance(String className, Object[] args) throws Exception {   
            Class newoneClass = Class.forName(className);   
      
            Class[] argsClass = new Class[args.length];   
      
            for (int i = 0, j = args.length; i < j; i++) {   
                argsClass[i] = args[i].getClass();   
            }   
      
            Constructor cons = newoneClass.getConstructor(argsClass);   
      
            return cons.newInstance(args);   
      
        }   
      
      
           
        /**  
         * 是不是某个类的实例  
         * @param obj 实例  
         * @param cls 类  
         * @return 如果 obj 是此类的实例,则返回 true  
         */  
        public boolean isInstance(Object obj, Class cls) {   
            return cls.isInstance(obj);   
        }   
           
        /**  
         * 得到数组中的某个元素  
         * @param array 数组  
         * @param index 索引  
         * @return 返回指定数组对象中索引组件的值  
         */  
        public Object getByArray(Object array, int index) {   
            return Array.get(array,index);   
        }   
    }                                                                
}        
 
                      


分享到:
评论

相关推荐

    Java反射经典实例 Java Reflection Cookbook[1].pdf

    ### Java反射经典实例详解 #### 一、引言 反射是Java编程语言中的一个重要特性,它允许程序在运行时检查自身结构(如类、字段、方法等),并且可以在运行时调用任意一个类的成员(包括私有成员)。这一特性为Java...

    Java Reflection (JAVA反射)详解

    Java 反射(Reflection)是Java编程语言的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、方法、字段等)并直接操作对象的内部属性。这为开发者提供了强大的灵活性,能够在不预先知道具体类的情况下...

    圣思园 reflection(Java反射) 课件

    Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。通过反射,开发者可以在程序执行过程中动态地获取类的信息并进行操作,这为Java应用程序提供了高度的灵活性...

    Java 反射机制 代码的实例

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

    java reflect and dynamic proxy .Java反射和动态代理

    **Java反射(Reflection)** Java反射允许我们在运行时检查类、接口、字段和方法的信息,甚至可以创建和调用对象。它主要由java.lang.reflect包中的类提供支持,如Class、Constructor、Method和Field等。以下是一些...

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

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

    Java Reflection (JAVA反射)

    ### Java反射机制详解 #### 一、Java反射机制概述 反射是Java编程语言的一个关键特性,它赋予了Java程序在运行时自我检查的能力,并能够直接操纵程序内部的属性。通过反射,开发者可以在运行时获取类的信息(如...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    在Java中使用反射API的一个实例

    下面我们将深入探讨如何利用Java反射API实现这些功能。 首先,要使用反射API,我们需要导入`java.lang.reflect`包中的几个关键类:`Class`、`Constructor`、`Method`和`Field`。这些类分别代表类对象、构造器对象、...

    java高手真经 光盘源码

    java高手真经 全光盘源代码 打包rar ...javareflection.zip 26.Java反射机制与动态代理 javageneric.zip 27.Java泛型编程 javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性

    Java反射实例源码

    标题"Java反射实例源码"表明我们将探讨如何通过源代码来实现和理解Java反射。这个实例可能包含了如何动态地创建对象、调用方法、访问字段和执行构造器的示例。 描述中提到的博客文章"菜鸟学编程(九)——Java反射...

    Java高手真经(编程基础卷)光盘全部源码 免积分

    看到那些要积分的很不酸,发布免费版本。...javareflection.zip 26.Java反射机制与动态代理 javageneric.zip 27.Java泛型编程 javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法等对象。枚举(Enumeration)是Java中的一个特殊类类型,用于定义一组常量。本项目"test-enum-demo-...

    Reflection_in_Java.zip_in_java 反射_java 反射机制_java反射_反射机制

    Java反射机制是Java编程语言中一个强大的特性,它允许运行时的程序动态地获取类的信息并操作类的对象。在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包下的类如`Constructor`、`Method`和`...

    java-reflection-Xiangjie.rar_java 反射

    配合文档中的实例和示例代码,读者可以更深入地理解和掌握Java反射的精髓。 总结起来,Java反射是Java语言的一个重要特性,它提供了对运行时类信息的访问和操作能力,极大地增强了代码的灵活性和可扩展性。然而,...

    java反射机制实例

    这个实例将深入探讨Java反射机制的使用,通过具体代码示例来阐述其工作原理和应用。 在Java中,反射机制主要用于在运行时获取类的信息,包括类名、方法名、参数类型等,并且可以动态调用对象的方法或访问对象的属性...

    JAVA 私塾笔记整理——反射机制(Reflection)

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理对象、类、接口以及它们之间的关系...

Global site tag (gtag.js) - Google Analytics