您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > Java反射机制_尚硅谷_宋红康
“玩转”Java系列—————————————————————————————1【更多Java–Android资料下载,可访问尚硅谷(中国)官网下载区】题目:java的反射机制问题:在运行时,对一个JAVA类,能否知道属性和方法;能否调用它的任意方法?答案是可以的,JAVA提供一种反射机制可以实现。目录什么是JAVA的反射机制JDK中提供的ReflectionAPIJAVA反射机制提供了什么功能o获取类的Class对象o获取类的Fieldso获取类的Methodo获取类的Constructoro新建类的实例ClassT的函数newInstance通过Constructor对象的方法newInstance调用类的函数调用private函数设置/获取类的属性值private属性动态创建代理类动态代理源码分析JAVA反射ClassT类型源代码分析JAVA反射原理分析Class文件结构JVM加载类对象,对反射的支持JAVA反射的应用一、什么是JAVA的反射机制Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过ReflectionAPIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public,static等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。换言之,Java可以加载一个运行时才得知名称的class,获得其完整结构。二、JDK中提供的ReflectionAPI“玩转”Java系列—————————————————————————————2【更多Java–Android资料下载,可访问尚硅谷(中国)官网下载区】Java反射相关的API在包java.lang.reflect中,JDK1.6.0的reflect包如下图:Member接口该接口可以获取有关类成员(域或者方法)后者构造函数的信息。AccessibleObject类该类是域(field)对象、方法(method)对象、构造函数(constructor)对象的基础类。它提供了将反射的对象标记为在使用时取消默认Java语言访问控制检查的能力。Array类该类提供动态地生成和访问JAVA数组的方法。Constructor类提供一个类的构造函数的信息以及访问类的构造函数的接口。Field类提供一个类的域的信息以及访问类的域的接口。Method类提供一个类的方法的信息以及访问类的方法的接口。Modifier类提供了static方法和常量,对类和成员访问修饰符进行解码。Proxy类提供动态地生成代理类和类实例的静态方法。三、JAVA反射机制提供了什么功能Java反射机制提供如下功能:在运行时判断任意一个对象所属的类在运行时构造任意一个类的对象在运行时判段任意一个类所具有的成员变量和方法在运行时调用任一个对象的方法“玩转”Java系列—————————————————————————————3【更多Java–Android资料下载,可访问尚硅谷(中国)官网下载区】在运行时创建新类对象在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象。这里首先定义用于测试的类:ViewCode?12345678910111213141516171819202122232425262728classType{publicintpubIntField;publicStringpubStringField;privateintprvIntField;publicType(){Log(DefaultConstructor);}Type(intarg1,Stringarg2){pubIntField=arg1;pubStringField=arg2;Log(Constructorwithparameters);}publicvoidsetIntField(intval){this.prvIntField=val;}publicintgetIntField(){returnprvIntField;}privatevoidLog(Stringmsg){System.out.println(Type:+msg);}}“玩转”Java系列—————————————————————————————4【更多Java–Android资料下载,可访问尚硅谷(中国)官网下载区】293031323334353637383940414243444546474849505152535455classExtendTypeextendsType{publicintpubIntExtendField;publicStringpubStringExtendField;privateintprvIntExtendField;publicExtendType(){Log(DefaultConstructor);}ExtendType(intarg1,Stringarg2){pubIntExtendField=arg1;pubStringExtendField=arg2;Log(Constructorwithparameters);}publicvoidsetIntExtendField(intfield7){this.prvIntExtendField=field7;}publicintgetIntExtendField(){returnprvIntExtendField;}privatevoidLog(Stringmsg){System.out.println(ExtendType:+msg);}}1、获取类的Class对象Class类的实例表示正在运行的Java应用程序中的类和接口。获取类的Class对象有多种方式:“玩转”Java系列—————————————————————————————5【更多Java–Android资料下载,可访问尚硅谷(中国)官网下载区】调用getClassBooleanvar1=true;Class?classType2=var1.getClass();System.out.println(classType2);输出:classjava.lang.Boolean运用.class语法Class?classType4=Boolean.class;System.out.println(classType4);输出:classjava.lang.Boolean运用staticmethodClass.forName()Class?classType5=Class.forName(java.lang.Boolean);System.out.println(classType5);输出:classjava.lang.Boolean运用primitivewrapperclasses的TYPE语法这里返回的是原生类型,和Boolean.class返回的不同Class?classType3=Boolean.TYPE;System.out.println(classType3);输出:boolean2、获取类的Fields可以通过反射机制得到某个类的某个属性,然后改变对应于这个类的某个实例的该属性值。JAVA的ClassT类提供了几个方法获取类的属性。publicFieldgetField(Stringname)返回一个Field对象,它反映此Class对象所表示的类或接口的指定公共成员字段publicField[]getFields()返回一个包含某些Field对象的数组,这些对象反映此Class对象所表示的类或接口的所有可访问公共字段publicFieldgetDeclaredField(Stringname)返回一个Field对象,该对象反映此Class对象所表示的类或接口的指定已声明字段publicField[]getDeclaredFields()返回Field对象的一个数组,这些对象反映此Class对象所表示的类或接口所声明的所有字段“玩转”Java系列—————————————————————————————6【更多Java–Android资料下载,可访问尚硅谷(中国)官网下载区】ViewCode?1234567891011121314151617Class?classType=ExtendType.class;//使用getFields获取属性Field[]fields=classType.getFields();for(Fieldf:fields){System.out.println(f);}System.out.println();//使用getDeclaredFields获取属性fields=classType.getDeclaredFields();for(Fieldf:fields){System.out.println(f);}输出:publicintcom.quincy.ExtendType.pubIntExtendFieldpublicjava.lang.Stringcom.quincy.ExtendType.pubStringExtendFieldpublicintcom.quincy.Type.pubIntFieldpublicjava.lang.Stringcom.quincy.Type.pubStringFieldpublicintcom.quincy.ExtendType.pubIntExtendFieldpublicjava.lang.Stringcom.quincy.ExtendType.pubStringExtendFieldprivateintcom.quincy.ExtendType.prvIntExtendField可见getFields和getDeclaredFields区别:getFields返回的是申明为public的属性,包括父类中定义,getDeclaredFields返回的是指定类定义的所有定义的属性,不包括父类的。3、获取类的Method“玩转”Java系列—————————————————————————————7【更多Java–Android资料下载,可访问尚硅谷(中国)官网下载区】通过反射机制得到某个类的某个方法,然后调用对应于这个类的某个实例的该方法ClassT类提供了几个方法获取类的方法。publicMethodgetMethod(Stringname,Class?...parameterTypes)返回一个Method对象,它反映此Class对象所表示的类或接口的指定公共成员方法publicMethod[]getMethods()返回一个包含某些Method对象的数组,这些对象反映此Class对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共member方法publicMethodgetDeclaredMethod(Stringname,Class?...parameterTypes)返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定已声明方法publicMethod[]getDeclaredMethods()返回Method对象的一个数组,这些对象反映此Class对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的
本文标题:Java反射机制_尚硅谷_宋红康
链接地址:https://www.777doc.com/doc-5536411 .html