- 浏览: 37481 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
lenomon:
可以看看这个demo, M2eclipse 设置 Mave ...
Maven学习笔记(二)——Eclipse插件安装(m2eclipse)
Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。
1. 得到某个对象的属性
Class ownerClass = owner.getClass():得到该对象的Class。
Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。
Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。
2. 得到某个类的静态属性
Class ownerClass = Class.forName(className) :首先得到这个类的Class。
Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。
Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。
3. 执行某对象的方法
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. 执行某个类的静态方法
基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。
5. 新建实例
这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。
Class newoneClass = Class.forName(className):第一步,得到要构造的实例的Class。
第5~第9行:得到参数的Class数组。
Constructor cons = newoneClass.getConstructor(argsClass):得到构造子。
cons.newInstance(args):新建实例。
6. 判断是否为某个类的实例
7. 得到数组中的某个元素
附完整源码:
1. 得到某个对象的属性
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1publicObjectgetProperty(Objectowner,StringfieldName)throwsException{
2ClassownerClass=owner.getClass();
3
4Fieldfield=ownerClass.getField(fieldName);
5
6Objectproperty=field.get(owner);
7
8returnproperty;
9}
2ClassownerClass=owner.getClass();
3
4Fieldfield=ownerClass.getField(fieldName);
5
6Objectproperty=field.get(owner);
7
8returnproperty;
9}
Class ownerClass = owner.getClass():得到该对象的Class。
Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。
Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。
2. 得到某个类的静态属性
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1publicObjectgetStaticProperty(StringclassName,StringfieldName)
2throwsException{
3ClassownerClass=Class.forName(className);
4
5Fieldfield=ownerClass.getField(fieldName);
6
7Objectproperty=field.get(ownerClass);
8
9returnproperty;
10}
2throwsException{
3ClassownerClass=Class.forName(className);
4
5Fieldfield=ownerClass.getField(fieldName);
6
7Objectproperty=field.get(ownerClass);
8
9returnproperty;
10}
Class ownerClass = Class.forName(className) :首先得到这个类的Class。
Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。
Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。
3. 执行某对象的方法
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1publicObjectinvokeMethod(Objectowner,StringmethodName,Object[]args)throwsException{
2
3ClassownerClass=owner.getClass();
4
5Class[]argsClass=newClass[args.length];
6
7for(inti=0,j=args.length;i<j;i++){
8argsClass[i]=args[i].getClass();
9}
10
11Methodmethod=ownerClass.getMethod(methodName,argsClass);
12
13returnmethod.invoke(owner,args);
14}
2
3ClassownerClass=owner.getClass();
4
5Class[]argsClass=newClass[args.length];
6
7for(inti=0,j=args.length;i<j;i++){
8argsClass[i]=args[i].getClass();
9}
10
11Methodmethod=ownerClass.getMethod(methodName,argsClass);
12
13returnmethod.invoke(owner,args);
14}
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. 执行某个类的静态方法
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1publicObjectinvokeStaticMethod(StringclassName,StringmethodName,
2Object[]args)throwsException{
3ClassownerClass=Class.forName(className);
4
5Class[]argsClass=newClass[args.length];
6
7for(inti=0,j=args.length;i<j;i++){
8argsClass[i]=args[i].getClass();
9}
10
11Methodmethod=ownerClass.getMethod(methodName,argsClass);
12
13returnmethod.invoke(null,args);
14}
2Object[]args)throwsException{
3ClassownerClass=Class.forName(className);
4
5Class[]argsClass=newClass[args.length];
6
7for(inti=0,j=args.length;i<j;i++){
8argsClass[i]=args[i].getClass();
9}
10
11Methodmethod=ownerClass.getMethod(methodName,argsClass);
12
13returnmethod.invoke(null,args);
14}
基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。
5. 新建实例
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1
2publicObjectnewInstance(StringclassName,Object[]args)throwsException{
3ClassnewoneClass=Class.forName(className);
4
5Class[]argsClass=newClass[args.length];
6
7for(inti=0,j=args.length;i<j;i++){
8argsClass[i]=args[i].getClass();
9}
10
11Constructorcons=newoneClass.getConstructor(argsClass);
12
13returncons.newInstance(args);
14
15}
2publicObjectnewInstance(StringclassName,Object[]args)throwsException{
3ClassnewoneClass=Class.forName(className);
4
5Class[]argsClass=newClass[args.length];
6
7for(inti=0,j=args.length;i<j;i++){
8argsClass[i]=args[i].getClass();
9}
10
11Constructorcons=newoneClass.getConstructor(argsClass);
12
13returncons.newInstance(args);
14
15}
这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。
Class newoneClass = Class.forName(className):第一步,得到要构造的实例的Class。
第5~第9行:得到参数的Class数组。
Constructor cons = newoneClass.getConstructor(argsClass):得到构造子。
cons.newInstance(args):新建实例。
6. 判断是否为某个类的实例
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1publicbooleanisInstance(Objectobj,Classcls){
2returncls.isInstance(obj);
3}
2returncls.isInstance(obj);
3}
7. 得到数组中的某个元素
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1publicObjectgetByArray(Objectarray,intindex){
2returnArray.get(array,index);
3}
2returnArray.get(array,index);
3}
附完整源码:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->importjava.lang.reflect.Array;
importjava.lang.reflect.Constructor;
importjava.lang.reflect.Field;
importjava.lang.reflect.Method;
/**
*JavaReflectionCookbook
*
*@authorMichaelLee
*@since2006-8-23
*@version0.1a
*/
publicclassReflection{
/**
*得到某个对象的公共属性
*
*@paramowner,fieldName
*@return该属性对象
*@throwsException
*
*/
publicObjectgetProperty(Objectowner,StringfieldName)throwsException{
ClassownerClass=owner.getClass();
Fieldfield=ownerClass.getField(fieldName);
Objectproperty=field.get(owner);
returnproperty;
}
/**
*得到某类的静态公共属性
*
*@paramclassName类名
*@paramfieldName属性名
*@return该属性对象
*@throwsException
*/
publicObjectgetStaticProperty(StringclassName,StringfieldName)
throwsException{
ClassownerClass=Class.forName(className);
Fieldfield=ownerClass.getField(fieldName);
Objectproperty=field.get(ownerClass);
returnproperty;
}
/**
*执行某对象方法
*
*@paramowner
*对象
*@parammethodName
*方法名
*@paramargs
*参数
*@return方法返回值
*@throwsException
*/
publicObjectinvokeMethod(Objectowner,StringmethodName,Object[]args)
throwsException{
ClassownerClass=owner.getClass();
Class[]argsClass=newClass[args.length];
for(inti=0,j=args.length;i<j;i++){
argsClass[i]=args[i].getClass();
}
Methodmethod=ownerClass.getMethod(methodName,argsClass);
returnmethod.invoke(owner,args);
}
/**
*执行某类的静态方法
*
*@paramclassName
*类名
*@parammethodName
*方法名
*@paramargs
*参数数组
*@return执行方法返回的结果
*@throwsException
*/
publicObjectinvokeStaticMethod(StringclassName,StringmethodName,
Object[]args)throwsException{
ClassownerClass=Class.forName(className);
Class[]argsClass=newClass[args.length];
for(inti=0,j=args.length;i<j;i++){
argsClass[i]=args[i].getClass();
}
Methodmethod=ownerClass.getMethod(methodName,argsClass);
returnmethod.invoke(null,args);
}
/**
*新建实例
*
*@paramclassName
*类名
*@paramargs
*构造函数的参数
*@return新建的实例
*@throwsException
*/
publicObjectnewInstance(StringclassName,Object[]args)throwsException{
ClassnewoneClass=Class.forName(className);
Class[]argsClass=newClass[args.length];
for(inti=0,j=args.length;i<j;i++){
argsClass[i]=args[i].getClass();
}
Constructorcons=newoneClass.getConstructor(argsClass);
returncons.newInstance(args);
}
/**
*是不是某个类的实例
*@paramobj实例
*@paramcls类
*@return如果obj是此类的实例,则返回true
*/
publicbooleanisInstance(Objectobj,Classcls){
returncls.isInstance(obj);
}
/**
*得到数组中的某个元素
*@paramarray数组
*@paramindex索引
*@return返回指定数组对象中索引组件的值
*/
publicObjectgetByArray(Objectarray,intindex){
returnArray.get(array,index);
}
}
importjava.lang.reflect.Constructor;
importjava.lang.reflect.Field;
importjava.lang.reflect.Method;
/**
*JavaReflectionCookbook
*
*@authorMichaelLee
*@since2006-8-23
*@version0.1a
*/
publicclassReflection{
/**
*得到某个对象的公共属性
*
*@paramowner,fieldName
*@return该属性对象
*@throwsException
*
*/
publicObjectgetProperty(Objectowner,StringfieldName)throwsException{
ClassownerClass=owner.getClass();
Fieldfield=ownerClass.getField(fieldName);
Objectproperty=field.get(owner);
returnproperty;
}
/**
*得到某类的静态公共属性
*
*@paramclassName类名
*@paramfieldName属性名
*@return该属性对象
*@throwsException
*/
publicObjectgetStaticProperty(StringclassName,StringfieldName)
throwsException{
ClassownerClass=Class.forName(className);
Fieldfield=ownerClass.getField(fieldName);
Objectproperty=field.get(ownerClass);
returnproperty;
}
/**
*执行某对象方法
*
*@paramowner
*对象
*@parammethodName
*方法名
*@paramargs
*参数
*@return方法返回值
*@throwsException
*/
publicObjectinvokeMethod(Objectowner,StringmethodName,Object[]args)
throwsException{
ClassownerClass=owner.getClass();
Class[]argsClass=newClass[args.length];
for(inti=0,j=args.length;i<j;i++){
argsClass[i]=args[i].getClass();
}
Methodmethod=ownerClass.getMethod(methodName,argsClass);
returnmethod.invoke(owner,args);
}
/**
*执行某类的静态方法
*
*@paramclassName
*类名
*@parammethodName
*方法名
*@paramargs
*参数数组
*@return执行方法返回的结果
*@throwsException
*/
publicObjectinvokeStaticMethod(StringclassName,StringmethodName,
Object[]args)throwsException{
ClassownerClass=Class.forName(className);
Class[]argsClass=newClass[args.length];
for(inti=0,j=args.length;i<j;i++){
argsClass[i]=args[i].getClass();
}
Methodmethod=ownerClass.getMethod(methodName,argsClass);
returnmethod.invoke(null,args);
}
/**
*新建实例
*
*@paramclassName
*类名
*@paramargs
*构造函数的参数
*@return新建的实例
*@throwsException
*/
publicObjectnewInstance(StringclassName,Object[]args)throwsException{
ClassnewoneClass=Class.forName(className);
Class[]argsClass=newClass[args.length];
for(inti=0,j=args.length;i<j;i++){
argsClass[i]=args[i].getClass();
}
Constructorcons=newoneClass.getConstructor(argsClass);
returncons.newInstance(args);
}
/**
*是不是某个类的实例
*@paramobj实例
*@paramcls类
*@return如果obj是此类的实例,则返回true
*/
publicbooleanisInstance(Objectobj,Classcls){
returncls.isInstance(obj);
}
/**
*得到数组中的某个元素
*@paramarray数组
*@paramindex索引
*@return返回指定数组对象中索引组件的值
*/
publicObjectgetByArray(Objectarray,intindex){
returnArray.get(array,index);
}
}
发表评论
-
系统研究Java--容器(二)--使用Abstract类
2011-02-23 14:34 0这个示例在于演示通过继承java.util.Abstract来 ... -
Maven学习笔记(一)——安装与配置
2011-12-24 17:48 10761. 准备工作 操作系统 ... -
Maven学习笔记(二)——Eclipse插件安装(m2eclipse)
2011-12-24 19:06 1469如何安装Eclipse插件 关于如何安装Ecli ... -
Maven学习笔记(三)——坐标和依赖
2011-12-27 12:58 885参考书籍Maven实战:可在InfoQ的Minibook出下载 ... -
`nonmutating' is not defined (Ice)
2012-02-20 14:40 805说明出处:http://download.zeroc.com/ ... -
Java中的所有异常
2011-02-14 13:33 590原文地址:http://www.knowsky.com/540 ... -
Java中为什么实现了Serializable接口就具备了被序列化的能力以及serialVersionUID的作用
2011-02-14 13:38 668Java 规定的内部机制,实现 Serializable 接口 ... -
系统研究Java--容器(一)
2011-02-14 15:12 750如上图:java完整容器的结构图 个人觉得j ... -
Java中的volatile关键字
2011-02-18 10:09 605我们知道,在Java中设 ... -
系统研究Java--数组(一)
2011-02-22 15:55 570数组不可越界,如果越界将会得到一个表示程序错误的Runtim ... -
系统研究Java--容器(二)--使用Abstract类
2011-02-23 14:34 556这个示例在于演示通过继承java.util.Abstract来 ... -
系统研究Java--容器(三)--Collection
2011-02-23 15:36 589<!-- ========== METHOD SUMMA ... -
系统研究Java--容器(五)--部分容器的底层实现
2011-02-23 16:28 801List和存储顺序 从List接口展开的实现类有ArrayL ... -
系统研究Java--容器(四)--Map和Set
2011-02-23 17:59 600Map是Java容器的又一长老 ... -
系统研究Java--容器(六)--Collections工具类
2011-03-01 14:36 743<!-- ========== METHOD SUMMA ... -
系统研究Java--I/O(一)
2011-03-03 16:14 546先占个位置,来两个图 -
abstract class 与 interface 的区别
2011-03-07 11:43 656对于abstract class 和 interf ... -
Java几种常用关键字总结
2011-03-25 11:00 6351.abstract abstract关键字可以用来修 ... -
一个简单的验证码生成工具--servlet版本
2011-05-13 21:20 653需要用到servlet-api.jar package co ... -
Hibernate将Enum枚举类型映射为Int类型
2011-07-01 15:19 1125最近要用Hibernate做一个枚举类型的映射,在MySQL数 ...
相关推荐
Java反射经典实例 Java Reflection Cookbook[1].docx.pdf
java 经典实例 代码 第一部分10M cookbook 封面 斗鸡 O'Reilly qq:287196468 分2部分下载
Kubernetes经典实例:Kubernetes Cookbook 中、英文版 高清打包合集
If you're a beginner, R Cookbook will help get you started. If you're an experienced data programmer, it will jog your memory and expand your horizons. You'll get the job done faster and learn more ...
java cookbook O'Reilly
java7 new features cookbook
Java.9.Concurrency.Cookbook.2nd.Edition.2017年新书,值得一看,欢迎下载!
Java 9 Cookbook 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
java script cookbook practical learning
Java 11 Cookbook offers a range of software development solutions with simple and straightforward Java 11 code examples to help you build a modern software system. Starting with the installation of ...
《java7并发编程实战手册》《java7 concurrency Cookbook》源码
Java SOA Cookbook 源代码
Java SOA Cookbook.zip Java SOA Cookbook.zip Java SOA Cookbook.zip
Java 7 New Features Cookbook
Java.9.Cookbook, 2017年新书,值得一看,欢迎下载!!!
Java EE 8 Cookbook 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书
《Java 7 Concurrency Cookbook》教程及代码。...《Java 7 Concurrency Cookbook》这本书不错,每节一个实例。 《Java Concurrency in Practice》这本书理论比较多,有点难懂,适合高级水平吧。 Book review: ...
Java Cookbook(3rd) 英文无水印pdf 第3版 pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或...
完整中文pdf版PHP经典实例(第3版) [PHP cookbook 3rd]