- 浏览: 103558 次
- 性别:
- 来自: 杭州
最新评论
-
whatlonelytear:
赞
java注解应用实例 - Annotation, 自定义注解, 注解类规则 -
砚台观月:
你好,例子还有吗,我想要份学习看下。提供的链接找不到了。
java网络编程之Http多线程下载应用实例 -
xianghanscce:
...
java泛型应用实例 - 自定义泛型类,方法 -
yhx1231:
...
Java反射应用实例 -
beiyeren:
写的不错啊
java注解应用实例 - Annotation, 自定义注解, 注解类规则
本文主要通过Java反射应用实例来讲解 利用反射方法创建对象(使用默认构造函数和自定义构造函数) ,访问对应对象的方法(包括带参数的和不带参数的),访问对应对象的域(Field) . 从 这里 可以下载到完整的java代码工程: http://download.csdn.net/detail/hejiangtao/4011663
很多IOC等框架都使用反射来实现,例如Spring, Hibernate等, Java反射的方式实现的逻辑比普通类逻辑的效率是要差一些的(14至300倍左右), 具体可以参考我转载的一篇文章<java反射的性能问题 >http://blog.csdn.net/hejiangtao/article/details/7188835.
首先看下我们实例中被访问的类DataTypeBean.java:
这个Bean中定义了4种类型的Field,包含了int, String,String数组和List; 定义了默认构造函数和自定义的构造函数; 还有一个给List域赋值的带参数函数; 一个不带参数的toString函数.我们要实现的就是使用反射的方法来访问这些Fields 和Methods.
- package com.ross.reflect.bean;
- import java.util.*;
- /**
- * Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
- * Date: 2012-1-4
- * Since: MyJavaExpert v1.0
- * Description: It will contains some typical fields whose data types
- * are using frequently. it will be used in the reflect test
- */
- public class DataTypeBean
- {
- private int iInt;
- private String sStr;
- private String[] saStr;
- List< Integer > oList;
- // default constructor
- public DataTypeBean()
- {
- }
- // constructor with parameters
- public DataTypeBean(int iInt, String sStr, String[] saStr,
- List< Integer > oList)
- {
- this.iInt = iInt;
- this.saStr = saStr;
- this.sStr = sStr;
- this.oList = oList;
- }
- // method with parameter, it will set value of the list field
- public void addDataToList(int iStart, int iEnd)
- {
- if (iStart < iEnd )
- {
- oList = new ArrayList < Integer > ();
- while (iStart < = iEnd)
- {
- oList.add(iStart);
- iStart++;
- }
- }
- }
- // method without parameter
- public String toString()
- {
- StringBuffer sbStr = new StringBuffer();
- sbStr.append("Values of the fields of DataTypeBean: iInt = ");
- sbStr.append(this.iInt).append(" ; ");
- for (int i = 0 ; i < this.saStr.length ; i++)
- {
- sbStr.append("saStr").append("[").append(i).append("]").append(
- " = ").append(saStr[i]).append(" ; ");
- }
- for (int j = 0 ; j < this.oList.size (); j++)
- {
- sbStr.append("oList.get").append("(").append(j).append(")").append(
- " = ").append(oList.get(j)).append(" ; ");
- }
- return sbStr.toString();
- }
- //省略了set/get方法
- }
来看我们的反射的实现类MyReflect.java, 由于担心代码太长不好看,就全部在Main函数里面写了,方便看.
1. 首先我们看下使用默认构造函数创建类对象, 并通过访问Field对象来给类对象赋值, 最后通过toString方法打印字符串.
初始化我们要使用的参数, 这些参数将用于给类的Field赋值:
获取 DataTypeBean的类,和我们将要用到的方法对象, 其中toString方法是不带参数的,addDataToList则是带参数的. 由此可以看出我们在使用反射方法的时候是需要知道参数个数和参数类型的:[html] view plain copy
- int iInt = 2012 ;
- String sStr = "This a string!" ;
- String[] saStr = new String[] { "First item of the string array",
- "Second item of the string array",
- "Third item of the string array" };
- List< Integer > oList = new ArrayList < Integer > ();
- // Initialize the oList
- int i = 0 ;
- while (i < 3 )
- {
- oList.add(i);
- i++;
- }
使用默认构造函数创建一个 DataTypeBean的对象:[html] view plain copy
- // get class
- Class oClass = Class.forName("com.ross.reflect.bean.DataTypeBean");
- // get the toString method, a method without parameters
- Method oToStringMethod = oClass .getMethod("toString");
- // get the addDataToList method, a method with parameters
- Method oAddDataToListMethod = oClass .getMethod("addDataToList",
- int.class, int.class);
使用反射方法访问Field来给对象赋值:[html] view plain copy
- // used default constructor to initialize a object
- Object oDefalutObject = oClass .newInstance();
通过反射方法调用 DataTypeBean的toString方法将赋值后的 DataTypeBean打印出来:[html] view plain copy
- // access fields process, getDeclaredFields can access private and
- // protected fields
- Field[] oFields = oClass .getDeclaredFields();
- for (int j = 0 ; j < oFields.length ; j++)
- {
- // to access the private
- oFields[j].setAccessible(true);
- // getSimpleName method can get the type of the field, according the
- // field type set the data to the field
- if ("int".equals(oFields[j].getType().getSimpleName()))
- {
- oFields[j].setInt(oDefalutObject, iInt);
- }
- else if ("String[]".equals(oFields[j].getType().getSimpleName()))
- {
- oFields[j].set(oDefalutObject, saStr);
- }
- else if ("String".equals(oFields[j].getType().getSimpleName()))
- {
- oFields[j].set(oDefalutObject, sStr);
- }
- else if ("List".equals(oFields[j].getType().getSimpleName()))
- {
- oFields[j].set(oDefalutObject, oList);
- }
- }
运行后,我们的控制台打印出如下信息:[html] view plain copy
- // print the object
- String sBeanString = (String) oToStringMethod.invoke(oDefalutObject);
- System.out
- .println("the string of the object created by defaut constructor: "
- + sBeanString);
[html] view plain copy
- the string of the object created by defaut constructor: Values of the fields of DataTypeBean: iInt = 2012 ;
- saStr[0] = First item of the string array ; saStr[1] = Second item of the string array ; saStr[2] = Third item
- of the string array ; oList.get(0) = 0 ; oList.get(1) = 1 ; oList.get(2) = 2 ;
2.
我们再看下使用自定义构造函数创建类对象, 并通过带参数的函数给其List域赋值, 最后通过toString方法打印字符串.
变更下我们要用的参数, 好在控制台上跟默认构造函数创建的对象的打印信息做区分:
使用自定义构造函数创建类对象:[html] view plain copy
- // initialize the parameters for customized constructor, the oList will
- // be initialized by the method with parameters
- iInt = 2013 ;
- sStr = "This another string!" ;
- saStr = new String[] { "1st item of the string array",
- "2nd item of the string array", "3rd item of the string array" };
- oList = new ArrayList < Integer > ();
使用带参数的函数给List 域赋值:[html] view plain copy
- // used customized constructor to initialize a object: DataTypeBean(int
- // iInt, String sStr, String[] saStr, List< Integer > oList)
- Constructor oCon = oClass .getConstructor(int.class, String.class,
- String[].class, List.class);
- Object oCustomizedObject = oCon .newInstance(iInt, sStr, saStr, oList);
同样的,通过反射方法调用 DataTypeBean的toString方法将赋值后的 DataTypeBean打印出来:[html] view plain copy
- //Use the method with parameters initialize the List Object
- oAddDataToListMethod.invoke(oCustomizedObject,2013,2015);
运行后,我们的控制台打印如下信息:[html] view plain copy
- // print the object
- sBeanString = (String) oToStringMethod.invoke(oCustomizedObject);
- System.out
- .println("the string of the object created by customized constructor: "
- + sBeanString);
[html] view plain copy
- the string of the object created by customized constructor: Values of the fields of DataTypeBean: iInt = 2013 ;
- saStr[0] = 1st item of the string array ; saStr[1] = 2nd item of the string array ; saStr[2] = 3rd item of the
- string array ; oList.get(0) = 2013 ; oList.get(1) = 2014 ; oList.get(2) = 2015 ; oList.get(3) = 2016 ;
为了方便参考,我将完整的MyReflect.java贴出来了:
- package com.ross.reflect;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
- * Date: 2012-1-9
- * Since: MyJavaExpert v1.0
- * Description: reflect method implementation and test
- */
- public class MyReflect
- {
- /**
- * Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
- * Date: 2012-1-9
- * Description: Use reflect method to access the fields and methods of DataTypebean
- */
- public static void main(String[] args) throws ClassNotFoundException,
- SecurityException, NoSuchMethodException, InstantiationException,
- IllegalAccessException, IllegalArgumentException,
- InvocationTargetException
- {
- int iInt = 2012 ;
- String sStr = "This a string!" ;
- String[] saStr = new String[] { "First item of the string array",
- "Second item of the string array",
- "Third item of the string array" };
- List< Integer > oList = new ArrayList < Integer > ();
- // Initialize the oList
- int i = 0 ;
- while (i < 3 )
- {
- oList.add(i);
- i++;
- }
- // get class
- Class oClass = Class.forName("com.ross.reflect.bean.DataTypeBean");
- // get the toString method, a method without parameters
- Method oToStringMethod = oClass .getMethod("toString");
- // get the addDataToList method, a method with parameters
- Method oAddDataToListMethod = oClass .getMethod("addDataToList",
- int.class, int.class);
- // used default constructor to initialize a object
- Object oDefalutObject = oClass .newInstance();
- // access fields process, getDeclaredFields can access private and
- // protected fields
- Field[] oFields = oClass .getDeclaredFields();
- for (int j = 0 ; j < oFields.length ; j++)
- {
- // to access the private
- oFields[j].setAccessible(true);
- // getSimpleName method can get the type of the field, according the
- // field type set the data to the field
- if ("int".equals(oFields[j].getType().getSimpleName()))
- {
- oFields[j].setInt(oDefalutObject, iInt);
- }
- else if ("String[]".equals(oFields[j].getType().getSimpleName()))
- {
- oFields[j].set(oDefalutObject, saStr);
- }
- else if ("String".equals(oFields[j].getType().getSimpleName()))
- {
- oFields[j].set(oDefalutObject, sStr);
- }
- else if ("List".equals(oFields[j].getType().getSimpleName()))
- {
- oFields[j].set(oDefalutObject, oList);
- }
- }
- // print the object
- String sBeanString = (String) oToStringMethod.invoke(oDefalutObject);
- System.out
- .println("the string of the object created by defaut constructor: "
- + sBeanString);
- // initialize the parameters for customized constructor, the oList will
- // be initialized by the method with parameters
- iInt = 2013 ;
- sStr = "This another string!" ;
- saStr = new String[] { "1st item of the string array",
- "2nd item of the string array", "3rd item of the string array" };
- oList = new ArrayList < Integer > ();
- // used customized constructor to initialize a object: DataTypeBean(int
- // iInt, String sStr, String[] saStr, List< Integer > oList)
- Constructor oCon = oClass .getConstructor(int.class, String.class,
- String[].class, List.class);
- Object oCustomizedObject = oCon .newInstance(iInt, sStr, saStr, oList);
- //Use the method with parameters initialize the List Object
- oAddDataToListMethod.invoke(oCustomizedObject,2013,2015);
- // print the object
- sBeanString = (String) oToStringMethod.invoke(oCustomizedObject);
- System.out
- .println("the string of the object created by customized constructor: "
- + sBeanString);
- }
- }
发表评论
-
<转>NetBeans 6.1 界面语言设置
2012-10-07 01:49 2346NetBeans 6.1 界面语言设置从官网下载的NetBea ... -
常见开源协议(BSD,Apache,GPL,LGPL,MIT)
2012-10-05 01:52 988BSD开源协议(original BSD license、Fr ... -
Java相对路径总结<转>
2012-03-04 17:16 10411.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或 ... -
Java Compiler 应用实例
2012-02-09 01:22 7043一直在用JDK1.5, 一直搞不清楚JDK1.6有啥特性, 就 ... -
java注解应用实例 - Annotation, 自定义注解, 注解类规则
2012-01-29 21:35 25673本文介绍了java的自定义注解及注解类编写的规则, 并通过实例 ... -
Java 序列化的高级认识--序列化反序列化, 加密存储<转>
2012-01-29 15:21 2304简介: 文章对序列化进行了更深一步的讨论,用实际的例子 ... -
java网络编程之Http多线程下载应用实例
2012-01-21 02:34 8685本demo 通过RandomAccessFile, URLC ... -
java反射的性能问题 (转)
2012-01-14 23:36 2278很多IOC,还有框架都使用反射。特别是在通过反射调用方法的时候 ... -
java泛型应用实例 - 自定义泛型类,方法
2012-01-14 23:19 37489注: 转载请注明出处: http://hejiangtao.i ... -
泛型的效率和原始类的效率比较(转)
2012-01-14 23:16 1851用 了好久的泛型,突然听到有人说:泛型影响效率! 嘿, ... -
文本数据库的简单java实现
2012-01-14 22:58 7246注: 转载请注明出处: ...
相关推荐
在标题“Java反射应用实例”中,我们关注的是如何在实际项目中利用反射来实现特定的功能。这篇博客文章(可以通过链接访问)可能会探讨以下几个方面: 1. **什么是反射**:首先,我们需要理解反射的基本概念。反射...
本实例将深入探讨Java反射的应用及其重要性。 一、什么是Java反射 Java反射机制允许我们动态地获取类的信息,并在运行时创建和调用对象的方法。这种能力使得Java具有高度的灵活性和动态性,特别是在处理跨版本兼容...
通过上述实例,我们可以看到Java反射机制在许多实际场景中的应用,它扩展了Java代码的灵活性和可扩展性。然而,也应注意,过度使用反射可能会引入复杂性和潜在的安全风险,因此在设计和实现时需权衡利弊。在理解了...
Java反射机制是Java编程语言中的一个强大...通过以上介绍,我们了解了Java反射机制的基本概念、使用方法、应用场景以及需要注意的问题。在实际编程中,合理利用反射可以提高代码的灵活性,但同时也需注意其潜在的风险。
在提供的"java反射实例代码"中,应该包含了如何使用上述方法的实际示例,这些示例有助于加深对Java反射机制的理解。通过阅读和运行这些代码,开发者可以更直观地学习如何在程序运行时动态地操作类、方法和字段,从而...
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
这个资源“java反射调用实例代码”提供了关于如何使用Java反射API进行各种操作的实际示例。 在Java中,`java.lang.reflect`包提供了对反射的支持,包括`Class`类,`Constructor`类,`Method`类和`Field`类。这些类...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...
Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...
### Java反射机制应用详解 #### 一、Java反射机制简介 Java反射机制是Java语言提供的一种能在运行时分析类信息并动态操作对象的功能。通过反射,我们可以在程序运行期间获取类的信息(如类名、方法名等),创建...
这个案例将深入探讨如何使用Java反射来实现一些实用的功能。 1. **获取类信息**: 反射机制首先从Class对象开始,它是所有Java类的元数据。通过`Class.forName()`方法或`类名.class`可以获取到Class对象。一旦有了...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...
### Java反射性能测试分析 ...- [Java Reflection and Performance: A Deep Dive](https://www.baeldung.com/java-reflection-performance):一篇深入分析Java反射性能的文章,包含更多的测试案例和优化建议。
Java反射是Java编程语言中的一个重要特性,它允许程序在...学习这个示例,你可以更好地掌握Java反射机制,如何实例化对象,调用方法以及访问字段。通过实践,你将能够灵活地应用反射到实际项目中,解决动态编程的需求。
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...
以下是对Java反射使用及相关知识点的详细阐述: 1. **获取Class对象** - `Class.forName(String className)`: 通过全限定类名获取Class对象。 - `object.getClass()`: 对象的`getClass()`方法返回该对象的Class...
本文将深入探讨Java反射机制,并通过一个具体的示例来演示如何使用反射动态加载实例类。 #### 一、Java反射概述 Java反射API主要由以下类和接口组成: - `java.lang.Class`:表示一个类或接口的信息。 - `java....
### Java反射机制的使用场景 反射通常用于以下几种情况: - 动态创建对象。 - 获取并操作对象属性和方法。 - 实现框架和库的功能扩展。 - 进行单元测试时模拟某些行为。 ### 示例代码解析 在给定的示例代码中,...