`
Vicent_Lee
  • 浏览: 56951 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

java反射应用实例及讲解

阅读更多

 

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。
5~9行:配置参数的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。
第5~第9行:得到参数的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深度开发

    三、Java反射实例 1. 创建对象:通过`Class.newInstance()`创建默认构造器的对象,或`Constructor.newInstance()`创建指定构造器的对象。 ```java Class&lt;?&gt; clazz = Class.forName("com.example.MyClass"); MyClass ...

    实例讲解java的反射

    实例讲解java的反射 实例讲解java的反射

    JAVA反射详细讲解

    Java反射详解 在Java编程语言中,反射是一个强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,甚至能够在运行时创建和访问这些对象。这种能力使得Java成为一种动态语言,增强了代码的灵活性和可扩展...

    实例讲解Java基础之反射

    Java反射是Java编程语言中的一个重要特性,它允许运行时的Java程序访问并操作类、接口、字段和方法等对象,即使这些对象在编译时并未被明确引用。反射提供了动态类型的能力,使得代码可以在运行时检查类的信息,创建...

    java反射机制讲解

    Java反射机制是Java语言提供的一种强大的能力,它允许我们在运行时检查类的信息并动态地创建和操作对象。这种机制使得程序具有更高的灵活性和扩展性,尤其是在框架开发中有着广泛的应用。 首先,我们要理解反射的...

    徐明浩java编程基础应用与实例代码

    《徐明浩java编程基础应用与实例代码》是针对初学者和有一定经验的Java程序员的一份宝贵资源,它深入浅出地介绍了Java编程的基础概念和实际应用。通过徐明浩先生的专业指导,读者可以系统性地掌握Java语言的核心要素...

    java 反射ppt 和 code 示例

    通过这份资料,开发者不仅可以理解Java反射的基本概念,还能通过实例学习到反射在实际项目中的应用技巧,提升编程的灵活性和可扩展性。同时,对反射的深入理解和正确使用,也能帮助解决很多设计模式和框架中的核心...

    Java编程基础、应用与实例

    Java编程基础、应用与实例是IT领域中针对初学者或有志于深入理解Java语言的一份宝贵资源。Java作为一种广泛使用的编程语言,以其跨平台、面向对象和强大的库支持而闻名。这份资料很可能会涵盖以下几个核心知识点: ...

    Java实例与讲解

    本资源包含的"Java实例与讲解"详细介绍了Java的核心概念和技术,旨在帮助学习者深入理解并熟练掌握Java编程。 1. **Java基础**:Java的基础包括语法、变量、数据类型、运算符、控制结构(如if语句、for循环、while...

    java入门与实例

    "Java入门与实例"针对的是对编程感兴趣的初学者,它提供了通俗易懂的讲解和实践案例,帮助初学者快速掌握Java编程基础。 Java的基础知识点包括: 1. **环境搭建**:首先,学习Java需要安装Java Development Kit ...

    JAVA编程实例大全及详解答案(50例)

    本资源"JAVA编程实例大全及详解答案(50例)"显然是为了帮助初学者和有经验的开发者深入理解Java语言并提升编程技能。通过50个具体的实例,读者可以学习到如何解决实际问题,理解各种编程概念,并且每个实例都提供了...

    java开发实例1200

    《Java开发实例1200》是一套丰富的学习资源,主要针对Java编程语言的应用实践,包含了大量的示例代码。这个压缩包是该系列的第二卷,提供了28M的压缩文件,解压后可达200多M,由此可见其内容之丰富。下面,我们将...

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

    侯捷先生是一位著名的Java技术专家,他的"流星絮语"系列教程深入浅出地讲解了Java反射机制。通过他的学习笔记,我们可以更深入地理解如何在实际项目中应用反射,解决一些特定问题,如插件化开发、序列化、动态代理等...

    Java技术和实例开发讲座-PPT

    总的来说,这个"Java技术和实例开发讲座"涵盖了从Java语言基础到高级特性的广泛内容,结合实例讲解,有助于参与者快速提升Java编程技能,并能够将所学知识应用到实际项目中。通过学习这个讲座,你将能够更好地理解和...

    java反射技术讲解

    总的来说,Java反射机制为开发者提供了强大的能力,能够在运行时探索和操纵类、对象、属性和方法,这在设计灵活的框架、插件系统、动态代理等方面具有广泛的应用。然而,由于其强大的功能,反射也可能带来性能开销和...

    Javafanshe.rar_java 反射_java反射_反射_反射机制

    《Java反射.txt》可能是对这些概念的详细讲解,而《www.pudn.com.txt》可能是来源于某个在线技术社区的讨论或教程,提供了额外的见解和实践应用。学习并理解这些内容,将有助于深入掌握Java的反射机制,提升编程灵活...

    java 应用 150 实例

    本教程“Java应用150实例”旨在深入浅出地讲解Java的基础知识,通过大量的实例帮助学习者掌握Java的核心概念和实际应用。下面我们将详细探讨这些实例所涵盖的知识点。 1. **Java语法基础** - **变量与数据类型**:...

    Java JDK 实例开发宝典

    除此之外,书中还会深入讲解Java Swing和JavaFX这两个图形用户界面(GUI)工具包,让你学会创建美观且功能丰富的桌面应用。对于Web开发,你将了解Servlet和JSP,掌握服务器端的Java编程技术。 在高级主题部分,你将...

    java简单实例程序源代码

    "java简单实例程序源代码"这个压缩包包含了一系列章节相关的Java实例源代码,适合初学者和有经验的开发者用来加深对Java语言的理解。以下是这些章节可能涉及的重要知识点的详细解释: 1. **CH11**: 这个章节可能...

Global site tag (gtag.js) - Google Analytics