版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一.bindinglinking构或变量类型这种语言称为动态语言个观点看,Perl,Python,Ruby是动态语言,C++,尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:ReflectionJavaclasses。换句话说,Java得知名称的class,获悉其完整构造(methods,并生成其对象实体、或对其fieldsmethods1class”的能力(theabilityoftheprogramtoexamineitself)被称为introspection(内省内观反省Reflection和introspectionJava如何能够做出上述的动态特性呢?这是一个深远话题,本文对此只简单介绍一些概念。整class”fieldsmethods。本文将谈到java.lang.Classjava.lang.reflectMethodFieldConstrUCtorclasses众所周知Java有个Objectclass,是所有Javaclasses的继续根源,其内了数个应该在所有Javaclass中被改写的methodshashCode()equals()clone()toString()getClass()getClass()Classobject。Classclass十分非凡。它和一般classes一样继续自Object,其实体用以表达Java运行classesinterfaces,enum、arrayprimitiveJavatypes(boolean,byte,char,short,int,long,float,double)voidclass当加载器(classloader)defineClass(JVM调用,JVM便自动产生一个Classobject。JavaClassobject(Class的constructorprintln()ClasspublicconstructorClass是Reflection故事针对任何您想探勘的class唯有先为它产生一个Classobject,ReflectionAPIs。二.ReflectionJava(或准动态)语言的一个重要特性。这个机制使应程序ReflectionAPISclass等等Object(例如Cloneable,也包括fieldsmethods的所有信息,并可于运行时改变fields唤起methods。ReflectionMethodjava.lang.reflectReflection中的类需要三个步骤:Class使用.fornameClassClass它们可获得基本类型的类信息。其中后法中的是基本类型的封装类(如integer)中预先定义好type获取要的类对象的已经的方获取类对象的方法的最简单和常用的方法是getDeclareMethods()方法。该方法返回类对象中packagepackageimportjava.lang.reflect.*;publicclassDumpMethods{publicstaticvoidmain(Stringargs[]){try{StringclassName="test1.Student";Classc=//Method[]m=c.getMethods();Method[]m=c.getDeclaredMethods();for(inti=0;i<m.length;i++)Methodmethod=m[i];}}catch(ClassNotFoundExceptione){}}}三Java.lang.reflectjava.lang.reflect包中包含有几个常用的接口,八个类InvocationHandler接口:是实例的调用处理程序实现的接Member接口:成员是一种接口,反映有关单个成员(字段或方法)或构造方法的AccessibleObject类:该类是域(field)对象、方法(method)对象、构造函数(constructor)对象的基础类Constructor类:提供一个类的构造函数的信息以及类的构造函数的接口Field类:提供一个类的域的信息以及类的域的接口。Method类:提供一个类的方法的信息以及类的方法的接口。Array类:该类提供动态地生成和JAVA数组的方法。Modifier类:Modifier类提供了static方法和常量,对类和成员修饰符进 类:提供动态地生成类和类实例的静态方法。ReflectPermission它允许取消由反射对象在其使用点上执行的Java语言四 示例与说3.1找类过的相关的信息(包括字段,构造方法packageimportpublicclassDumpMethodspublicstaticvoidmain(Stringargs[]){try{StringclassName=Student类的类对象Classcls=System.out.println("**************方法信息//返回一个 的所有方法的方法数Methodmethlist[]=//Methodmethlist[]=cls.getMethods();System.out.println(methlist.length);for(inti=0;i<methlist.length;i++){Methodm= +intmodifierType=m.getModifiers();System.out.println(modifierType);System.out.println("修饰符:"System.out.println(System.out.println("方法名称 "+Classpars[]=for(intj=0;j<pars.length;j++){System.out.print(jpars[j]);}Classexces[]=for(intj=0;j<exces.length;j++)System.out.print(jexces[j]}}}catch(ClassNotFoundExceptione){
}}}Classcls=Class.forName("method1")method1clsMethodmethlist[]=cls.getDeclaredMethods();返回一个类的所有方法的方法数组。m.getDeclaringClass();返回该方法的类的实例。返回值为一个class。Classpvec[]=m.getParameterTypes():返回该方法的参数的类型的一个数组。注意参数的返回顺序是与方法时的顺序是相同的。Classevec[]m.getExceptionTypes():获取该方法抛出的例外的一个类型数组。m.getReturnType():class。除了上述的Method类的方法外,还有别的方法。其中比较重要的Objectinvoke(Objectobj,Object[]args)方法:对该方法进行实际的调用并执3.4节。3.2取构造函数信//获取Class 的构造方Constructorctorlist[]=for(inti=0;i<ctorlist.length;i++){Constructorct=ctorlist[i];System.out.println(ct.getName()); 类:"+Classpvec[]=ct.getParameterTypes();for(intj=0;j<pvec.length;j++)System.out.println(j}Classevec[]=ct.getExceptionTypes();for(intj=0;j<evec.length;j++)System.out.println(j} }Constructorcons=Studentstu=ct.getDeclaringClass():返回该构造函数的类。返回值是一个class。Classpvec[]ct.getParameterTypes():返回该构造函数的参数的一个类型数组。返回的是一个class的数组。Classevec[]ct.getExceptionTypes():返回一个该构造函数的抛出的例外的除了上述的方法外,对于Constructor类还有一个很重要的方法3.3取类中域的信//获取类 Fieldfieldlist[]=cls.getDeclaredFields();3.3取类中域的信//获取类 Fieldfieldlist[]=cls.getDeclaredFields();for(inti=0;i<fieldlist.length;i++)Fieldfld=System.out.println("字段名称:"+fld.getName()); 类:"+fld.getDeclaringClass());System.out.println("字段类型"+fld.getType());intmod=fld.getModifiers();System.out.println(mod+ 3.43.4StringclassName=//获取一个Student类的类对象Classcls=Class.forName(className);Classpartypes[]=newClass[2];int类型的数据partypes[0]=Integer.TYPE;partypes[1]=Integer.TYPE;//partypes[0]=//partypes[1]=Methodmeth=cls.getDeclaredMethod("add",//Studentmethobj=newConstructorStudentstu=Objectarglist[]=new1指定为371指定为47arglist[0]=newInteger(37);arglist[1]=newInteger(47);//也可以通过如下方式指定int//arglist[0]=//arglist[1]=//调用add方法的,stu//arglist是该方法的参数,返回值是ObjectObjectretobjmeth.invoke(stu,arglist);//把返回值还原成Integerretval=(Integer)方法调用的实首先,类中有一个方法publicintadd(inta,intb)。请注意该方法的方法名’add’、两个形式参数的数据类型int以及返回值类型int。因为,这些信息接下来在主调函数中实现的功能如下ClassclsClass.forName("method2"):获取类实例对象clsClasspartypes[]=newClass[2];partypes[0]=Integer.TYPE;partypes[1]=Integer.TYPE;一个类数组,用来保存两个参数的数据类Methodmeth=cls.getMethod("add",partypes);注意getMethod方法,该JAVA参数类型数组中的各个参数类型的顺序必须与方法时的顺序相同method2methobj=newmethod2():一个类method2的实例变量Objectarglist[]=newObject[2];arglist[0]=newInteger(37);arglist[1]=new一个对象数组,来两个参数实例Objectretobjmeth.invoke(methobj,arglist):实际调用add意方法invoke()的两个参数,methobj是调用方法(或者是方法)的类的一个实例,arglist确实被调用方法(这里是add方法)的,参数实例数组。返回值仍然是一个对象的实例retobj。Integerretval=System.out.println(Value())换,并输出。3.53.5成一个新的实//Studentmethobj=newClass[]consParams=newClass[2];consParams[0]=int.class;consParams[1]=java.lang.String.class;Constructorcons=//Constructorcons//Studentstu=(Student)cons.newInstance(10,"zhansan");Object[]params=newObject[2];params[0]=10;params[1]=" Studentstu=(Student)cons.newInstance(params);这个例子说明了Constructor类的newInstancce()方法的使用。其具体的过程3.4节中使用invoke()方法类似,不再多说了。根据指定的参数类型找到3.63.6拟instanceofpublicstaticvoidmain(Stringargs[]){try{StringclassName=Student类的类对象Classcls=//创建了一个StudentclassStudent//Student不是,但newStudent()是。System.out.println(cls.isInstance(newStudent()));System.out.println(cls.isInstance(newString("abc")));}catch(Exceptione)publicstaticvoidmain(Stringargs[]){try{StringclassName=Student类的类对象Classcls=//创建了一个StudentclassStudent//Student不是,但newStudent()是。System.out.println(cls.isInstance(newStudent()));System.out.println(cls.isInstance(newString("abc")));}catch(Exceptione)}}3.73.7变字段(域)的reflection的还有一个用处就是改变对象数据字段的值reflection可以从正在运行StringStringclassName=//获取一个Student类的类对象Classcls=nameFieldfld=cls.getDeclaredField("name");Studentstu=newStudent();System.out.println("name="
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 技术支持服务响应时间调整商洽函3篇
- 智能化城市技术运用承诺书(7篇)
- 心脏康复合并肺部感染患者运动处方方案
- 未来科技创新计划承诺书5篇
- 环境投资专款专用承诺函(9篇)
- 心肌淀粉样变性心电生理特征与危险分层方案
- 心肌梗死后室壁瘤合并肾功能不全患者治疗调整方案
- 心肌桥合并高脂血症患者的他汀类药物剂量调整与血脂达标方案
- 催办2026年采购尾款回复函8篇范本
- 心房颤动射频消融术后术后动态心电图监测方案
- 2026上半年生态环境部卫星环境应用中心招聘15人笔试备考题库及答案解析
- 2025年建筑资料员招聘笔试试题及答案
- 2026年新入团考试知识大全(必考知识点+完整题库+标准答案)
- 2026杭州市萧山区招录高学历事业人员50人笔试参考题库及答案解析
- 2026年东莞市卫生健康系统事业单位人员招聘考试备考试题及答案详解
- 2026广东深圳市国资委面向市内选调公务员5人笔试备考试题及答案解析
- 2026年1月浙江省高考(首考)思想政治试题(含答案)
- 2026年大学后勤集团办公室文秘招聘笔试写作题
- 螺栓连接实验-2015.11.20
- DB32-T 3260-2017水利工程施工图设计文件编制规范-(高清现行)
- JJF 1941-2021 光学仪器检具校准规范
评论
0/150
提交评论