您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 第10章 Java反射机制
第10章Java语言的反射机制......................................................................................................................................................................................210.1JavaReflectionAPI简介.......................................................................................210.2在远程方法调用中运用发射机机制....................................................................710.3代理模式.............................................................................................................1010.3.1静态代理类..............................................................................................1110.3.2动态代理类..............................................................................................1310.3.3在远程方法调用中运用代理类...............................................................1610.4小节.....................................................................................................................21PDFcreatedwithpdfFactoryProtrialversion运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java语言的反射(Reflection)机制。Java反射机制主要提供了以下功能:l在运行时判断任意一个对象所属的类。l在运行时构造任意一个类的对象。l在运行时判断任意一个类所具有的成员变量和方法。l在运行时调用任意一个对象的方法。10.1JavaReflectionAPI简介在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:lClass类:代表一个类。lField类:代表类的成员变量(成员变量也称为类的属性)。lMethod类:代表类的方法。lConstructor类:代表类的构造方法。lArray类:提供了动态创建数组,以及访问数组的元素的静态方法以下例程10-1的DumpMethods类演示了ReflectionAPI的基本作用,它读取命令行参数指定的类名,然后打印这个类所具有的方法信息:例程10-1DumpMethods.javaimportjava.lang.reflect.*;publicclassDumpMethods{publicstaticvoidmain(Stringargs[])throwsException{//加载并初始化命令行参数指定的类ClassclassType=Class.forName(args[0]);//获得类的所有方法Methodmethods[]=classType.getDeclaredMethods();for(inti=0;imethods.length;i++)System.out.println(methods[i].toString());}}运行命令“javaDumpMethodsjava.util.Stack”,就会显示java.util.Stack类所具有的方法,程序的打印结果如下:publicsynchronizedjava.lang.Objectjava.util.Stack.pop()publicjava.lang.Objectjava.util.Stack.push(java.lang.Object)publicbooleanjava.util.Stack.empty()publicsynchronizedjava.lang.Objectjava.util.Stack.peek()publicsynchronizedintjava.util.Stack.search(java.lang.Object)例程10-2的ReflectTester类进一步演示了ReflectionAPI的基本使用方法。ReflectTester类有一个copy(Objectobject)方法,这个方法能够创建一个和参数object同样类型的对象,然后把object对象中的所有属性拷贝到新建的对象中,并将它返回。PDFcreatedwithpdfFactoryProtrialversion,假定JavaBean的每个属性都有public类型的getXXX()和setXXX()方法。例程10-2ReflectTester.javaimportjava.lang.reflect.*;publicclassReflectTester{publicObjectcopy(Objectobject)throwsException{//获得对象的类型ClassclassType=object.getClass();System.out.println(Class:+classType.getName());//通过默认构造方法创建一个新的对象ObjectobjectCopy=classType.getConstructor(newClass[]{}).newInstance(newObject[]{});//获得对象的所有属性Fieldfields[]=classType.getDeclaredFields();for(inti=0;ifields.length;i++){Fieldfield=fields[i];StringfieldName=field.getName();StringfirstLetter=fieldName.substring(0,1).toUpperCase();//获得和属性对应的getXXX()方法的名字StringgetMethodName=get+firstLetter+fieldName.substring(1);//获得和属性对应的setXXX()方法的名字StringsetMethodName=set+firstLetter+fieldName.substring(1);//获得和属性对应的getXXX()方法MethodgetMethod=classType.getMethod(getMethodName,newClass[]{});//获得和属性对应的setXXX()方法MethodsetMethod=classType.getMethod(setMethodName,newClass[]{field.getType()});//调用原对象的getXXX()方法Objectvalue=getMethod.invoke(object,newObject[]{});System.out.println(fieldName+:+value);//调用拷贝对象的setXXX()方法etMethod.invoke(objectCopy,newObject[]{value});}returnobjectCopy;}publicstaticvoidmain(String[]args)throwsException{Customercustomer=newCustomer(Tom,21);customer.setId(newLong(1));CustomercustomerCopy=(Customer)newReflectTester().copy(customer);System.out.println(Copyinformation:+customerCopy.getName()++customerCopy.getAge());}}classCustomer{//Customer类是一个JavaBeanprivateLongid;privateStringname;PDFcreatedwithpdfFactoryProtrialversion(){}publicCustomer(Stringname,intage){this.name=name;this.age=age;}publicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}}ReflectTester类的copy(Objectobject)方法依次执行以下步骤。(1)获得对象的类型:ClassclassType=object.getClass();System.out.println(Class:+classType.getName());在java.lang.Object类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是ReflectionAPI中的核心类,它有以下方法:lgetName():获得类的完整名字。lgetFields():获得类的public类型的属性。lgetDeclaredFields():获得类的所有属性。lgetMethods():获得类的public类型的方法。lgetDeclaredMethods():获得类的所有方法。lgetMethod(Stringname,Class[]parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。lgetConstrutors():获得类的public类型的构造方法。lgetConstrutor(Class[]parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。lnewInstance():通过类的不带参数的构造方法创建这个类的一个对象。(2)通过默认构造方法创建一个新的对象:ObjectobjectCopy=classType.getConstructor(newClass[]{}).newInstance(newObject[]{});以上代码先调用Class类的getConstructor()方法获得一个Constructor对象,它代表默认的构造方法,然后调用Constructor对象的newInstance()方法构造一个实例。(3)获得对象的所有属性:Fieldfields[]=clas
本文标题:第10章 Java反射机制
链接地址:https://www.777doc.com/doc-8632295 .html