java反射实例

上传人:小** 文档编号:97430240 上传时间:2022-05-27 格式:DOC 页数:7 大小:60KB
返回 下载 相关 举报
java反射实例_第1页
第1页 / 共7页
java反射实例_第2页
第2页 / 共7页
java反射实例_第3页
第3页 / 共7页
点击查看更多>>
资源描述
Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。1. 得到某个对象的属性publicObjectgetProperty(Objectowner,StringfieldName)throwsExceptionClassownerClass=owner.getClass();Fieldfield=ownerClass.getField(fieldName);Objectproperty=field.get(owner);returnproperty;ClassownerClass=owner.getClass():得到该对象的Class。Fieldfield=ownerClass.getField(fieldName):通过Class得到类声明的属性。Objectproperty=field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。2. 得到某个类的静态属性publicObjectgetStaticProperty(StringclassName,StringfieldName)throwsExceptionClassownerClass=Class.forName(className);Fieldfield=ownerClass.getField(fieldName);Objectproperty=field.get(ownerClass);returnproperty;ClassownerClass=Class.forName(className):首先得到这个类的Class。Fieldfield=ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。Objectproperty=field.get(ownerClass):这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。3. 执行某对象的方法publicObjectinvokeMethod(Objectowner,StringmethodName,Objectargs)throwsExceptionClassownerClass=owner.getClass();ClassargsClass=newClassargs.length;for(inti=0,j=args.length;ij;i+)argsClassi=argsi.getClass();Methodmethod=ownerClass.getMethod(methodName,argsClass);returnmethod.invoke(owner,args);Classowner_class=owner.getClass():首先还是必须得到这个对象的Class。36行:配置参数的Class数组,作为寻找Method的条件。Methodmethod=ownerClass.getMethod(methodName,argsClass):通过Method名和参数的Class数组得到要执行的Method。method.invoke(owner,args):执行该Method,invoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值。4. 执行某个类的静态方法publicObjectinvokeStaticMethod(StringclassName,StringmethodName,Objectargs)throwsExceptionClassownerClass=Class.forName(className);ClassargsClass=newClassargs.length;for(inti=0,j=args.length;ij;i+)argsClassi=argsi.getClass();Methodmethod=ownerClass.getMethod(methodName,argsClass);returnmethod.invoke(null,args);基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。5.新建实例publicObjectnewInstance(StringclassName,Objectargs)throwsExceptionClassnewoneClass=Class.forName(className);ClassargsClass=newClassargs.length;for(inti=0,j=args.length;ij;i+)argsClassi=argsi.getClass();Constructorcons=newoneClass.getConstructor(argsClass);returncons.newInstance(args);这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。ClassnewoneClass=Class.forName(className):第一步,得到要构造的实例的Class。第6第10行:得到参数的Class数组。Constructorcons=newoneClass.getConstructor(argsClass):得至U构造子。cons.newInstance(args):新建实例。6.判断是否为某个类的实例publicbooleanisInstance(Objectobj,Classcls)returncls.isInstance(obj);7.得到数组中的某个元素publicObjectgetByArray(Objectarray,intindex)returnArray.get(array,index);附完整源码: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)throwsExceptionClassownerClass=owner.getClass();Fieldfield=ownerClass.getField(fieldName);Objectproperty=field.get(owner);returnproperty;/*得到某类的静态公共属性*paramclassName类名*paramfieldName属性名*return该属性对象*throwsException*/publicObjectgetStaticProperty(StringclassName,StringfieldName)throwsExceptionClassownerClass=Class.forName(className);Fieldfield=ownerClass.getField(fieldName);Objectproperty=field.get(ownerClass);returnproperty;/*执行某对象方法*paramowner*对象*parammethodName*方法名*paramargs*参数*return方法返回值*throwsException*/publicObjectinvokeMethod(Objectowner,StringmethodName,Objectargs)throwsExceptionClassownerClass=owner.getClass();ClassargsClass=newClassargs.length;for(inti=0,j=args.length;ij;i+)argsClassi=argsi.getClass();Methodmethod=ownerClass.getMethod(methodName,argsClass);returnmethod.invoke(owner,args);/*执行某类的静态方法*paramclassName*类名*parammethodName*方法名*paramargs*参数数组*return执行方法返回的结果*throwsException*/publicObjectinvokeStaticMethod(StringclassName,StringmethodName,Objectargs)throwsExceptionClassownerClass=Class.forName(className);ClassargsClass=newClassargs.length;for(inti=0,j=args.length;ij;i+)argsClassi=argsi.getClass();Methodmethod=ownerClass.getMethod(methodName,argsClass);returnmethod.invoke(null,args);/*新建实例*paramclassName*类名*paramargs构造函数的参数*return新建的实例*throwsException*/publicObjectnewInstance(StringclassName,Objectargs)throwsExceptionClassnewoneClass=Class.forName(className);ClassargsClass=newClassargs.length;for(inti=0,j=args.length;ij;i+)argsClassi=argsi.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);
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!