【1】Method类简介 Java反射技术的一个基本应用之一就是在运行时期间动态地调用方法。要动态地调用方法,首先要获得方法本身。步骤如下:
1.获得Class对象
2.调用Class对象的getMethod(String, Class[])方法获得指定的方法
getMethod方法的第一个参数用来指定方法的名称,第二个参数是一个Class数组,用来存放代表各个参数类型的Class对象。这个方法有一个值得注意的地方:
如果参数类型是原子类型(int,long,short等),要使用诸如int.class,long.class来获取其对应Class对象,而不能使用对应的封装类对象。
在获得Method对象之后,就可以在运行时动态地调用方法了。Method类里面最主要的方法有以下几种
1.获取方法所在的类: getDeclaringClass()
2.获取方法签名中所有声明的抛出异常:getExceptionTypes()
3.获取方法签名中所有参数的类型: getParameterTypes()
4.获取方法签名中返回值的类型: getReturnType()
5.调用方法: Object invoke(Object obj, Object... args)
Method类的核心就是invoke方法,该方法用于Method对象唤起对象中对应的方法,特别要注意的是第二个参数:通常这是一个Object数组,这意味着如果参数是原子类型数据,必须先把他转换成对应的封装类对象,invoke方法会在后台自动将其解压成原子类型。
从JDK1.5开始之后,增加了"自动装箱"和"自动开箱"的功能,所以你可以看到在行61处,使用了原子类型数据而非封装类来传递参数。如果是在JDK1.4或以下版本,则此处会报错。建议不采用此种做法,以免出现数据类型完全的问题。
【2】使用反射拷贝对象的思路 1. 获取源对象的所有成员变量列表
2. 每次取出变量列表中的一个变量,获取其getXxx()和setXxx(Type)方法名称
3. 根据getXxx()和setXxx(Type)方法名称获得对应的Method对象
4. 源对象通过invoke(Object, Class[])方法调用getXxx()方法,获得成员变量的值
5. 目标对象通过invoke(Object, Class[])的方法的setXxx(Type)方法,为目标对象的成员变量赋值
其中关键的代码段格式如下:
1. 创建Method对象:Class.getMethod(method name, method prameters class array)
2. 调用方法:method.invoke(object, method parameters class array)
【3】示例代码
// 获得对象的所有属性
Field fields[] = classType.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
String firstLetter = fieldName.substring(0, 1).toUpperCase();
// 获得和属性对应的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1);
// 获得和属性对应的setXXX()方法的名字
String setMethodName = "set" + firstLetter + fieldName.substring(1);
// 获得和属性对应的getXXX()方法
Method getMethod = classType.getMethod(getMethodName,
new Class[] {});
// 获得和属性对应的setXXX()方法,使用filed对象的类型
Method setMethod = classType.getMethod(setMethodName,
new Class[] { field.getType() });
// 调用原对象的getXXX()方法:指定调用的对象和方法的参数值列表
Object value = getMethod.invoke(object, new Object[] {});
System.out.println(fieldName + ":" + value);
// 调用拷贝对象的setXXX()方法:指定调用的对象和参数值列表(注意必须是Object类型)
setMethod.invoke(objectCopy, new Object[] { value });
}
分享到:
相关推荐
1. **Class类**:每个Java类在运行时都有一个与之对应的Class对象,可以通过`Class.forName()`或对象的`getClass()`方法获取。Class对象提供了获取类信息的方法,如类名、包名、父类、接口、枚举常量等。 2. **...
在"Java Reflection in Action"这本书中,作者深入探讨了这一主题,为开发者提供了全面的理解和实践指导。以下是对这个话题的详细解释。 1. **什么是Java反射**: Java反射提供了一种在程序运行时动态地获取类信息...
### Java反射机制详解 #### 一、Java反射机制概述 反射是Java编程语言的一个关键特性,它赋予了Java程序在运行时自我检查的能力,并能够直接操纵程序内部的属性。通过反射,开发者可以在运行时获取类的信息(如...
Java 反射(Reflection)是Java编程语言的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、方法、字段等)并直接操作对象的内部属性。这为开发者提供了强大的灵活性,能够在不预先知道具体类的情况下...
本书《Java Reflection in Action》深入浅出地讲解了Java反射技术的各种应用场景和技术细节。书中通过一系列生动的例子展示了如何安全有效地使用反射技术解决实际问题。例如: 1. **使用反射进行动态代理**:介绍了...
《Java Reflection In Action》这本书深入探讨了这个主题,对于理解和掌握Java动态性有着极大的帮助。以下是关于Java反射的一些关键知识点: 1. **反射基础**:反射API主要包括`java.lang.Class`、`java.lang....
- 反射API:`java.lang.Class`,`java.lang.reflect`包中的`Constructor`,`Method`和`Field`类是Java反射的核心。 - `Class.forName()`方法:用于根据类名加载类对象。 - 获取类信息:通过`Class`对象可以获取类...
通过以上实例,我们可以看到Java反射机制的强大之处,它可以让我们在运行时动态地操作类、字段、方法等。然而,需要注意的是反射操作通常比普通操作要慢,并且可能会导致安全性问题,因此在实际开发中应当谨慎使用。...
《Java反射技术实战》这本书的独特之处在于它不仅详细解释了反射的各种编程技巧,还提供了足够的背景知识,让读者理解如何扩展和变化这些技巧。书中克服了反射作为神秘和深奥哲学追求的形象,也避免了一套混乱且容易...
在Java编程语言中,反射(Reflection)是一种强大的机制,它允许程序在运行时检查和修改其结构和行为。本文将深入探讨Java反射中的一个关键组件——`Method`,以及如何利用`Class`类的多种方法来获取和操作类的方法...
《Java反射实战》是2005年出版的一本深入探讨Java反射机制的专业教程,它为开发者揭示了Java编程中的一个重要而复杂的主题。...这本书深入浅出地讲解了反射的概念和实践,是Java开发者必备的参考书籍之一。
### Java反射技术详解——《Java Reflection in Action》 #### 一、引言 在现代软件开发领域,Java...通过阅读本书,不仅可以提高对Java反射的理解,还能激发新的创意和灵感,将反射技术应用于更多创新的场景之中。
Java反射是Java编程语言的核心特性之一,它允许程序员在运行时检查和操作类、接口、字段和方法等对象。这使得Java程序具有高度的灵活性和动态性,可以在不事先知晓具体类信息的情况下处理对象。 首先,要使用Java...
《Java Reflection in Action》一书由Ira R. Forman和Nate Forman共同撰写,旨在帮助读者深入理解Java反射机制的核心概念和技术细节,并通过一系列实用案例展示如何有效地利用反射技术来解决实际问题。 #### 二、...
在"High performance Java reflection.zip"这个压缩包中,我们可以期待找到关于优化Java反射性能的相关资料,特别是可能涉及的库"reflectasm-master"。 ReflectASM是一个轻量级、高性能的Java反射库,旨在提高反射...
Java反射(Reflection)和注解(Annotation)是Java编程语言中的两个重要特性,它们在实际开发中有着广泛的应用。在“浙大软件学院培训课件java reflection annotation”中,我们将会探讨这两个主题,特别是如何利用它们...