Java学习之二-Java反射机制

上传人:人*** 文档编号:498110633 上传时间:2022-11-15 格式:DOC 页数:14 大小:188KB
返回 下载 相关 举报
Java学习之二-Java反射机制_第1页
第1页 / 共14页
Java学习之二-Java反射机制_第2页
第2页 / 共14页
Java学习之二-Java反射机制_第3页
第3页 / 共14页
Java学习之二-Java反射机制_第4页
第4页 / 共14页
Java学习之二-Java反射机制_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《Java学习之二-Java反射机制》由会员分享,可在线阅读,更多相关《Java学习之二-Java反射机制(14页珍藏版)》请在金锄头文库上搜索。

1、文档供参考,可复制、编制,期待您的好评与关注! Java学习之二-Java反射机制 问题: 在运行时,对一个JAVA类,能否知道属性和方法;能否调用它的任意方法? 答案是可以的,JAVA提供一种反射机制可以实现。 目录 1. 什么是JAVA的反射机制 2. JDK中提供的Reflection API 3. JAVA反射机制提供了什么功能 4. 获取类的Class对象 5. 获取类的Fields 6. 获取类的Method 7. 获取类的Constructor 8. 新建类的实例 Class的函数newInstance 通过Constructor对象的方法newInstance9.调用类的函数

2、调用private函数 10. 设置/获取类的属性值 private属性 11. 动态创建代理类 动态代理源码分析 12. JAVA反射Class类型源代码分析 13. JAVA反射原理分析 Class文件结构 JVM加载类对象,对反射的支持 14. JAVA反射的应用一、什么是JAVA的反射机制 Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces

3、(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。 Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。 换言之,Java可以加载一个运行时才得知名称的class,获得其完整结构。 二、JDK中提供的Reflection API Java反射相关的API在包java.lang.reflect中,JDK 1.6.0的reflect包如下图: Member接口该接口可以获取有关类成员(域或者方法)后者构造函数的信息。AccessibleObject类该类是域(field)对象、方法(meth

4、od)对象、构造函数(constructor)对象的基础类.它提供了将反射的对象标记为在使用时取消默认Java 语言访问控制检查的能力。Array类该类提供动态地生成和访问JAVA数组的方法。Constructor类提供一个类的构造函数的信息以及访问类的构造函数的接口。Field类提供一个类的域的信息以及访问类的域的接口。Method类提供一个类的方法的信息以及访问类的方法的接口。Modifier类提供了 static 方法和常量,对类和成员访问修饰符进行解码。Proxy类提供动态地生成代理类和类实例的静态方法。 三、JAVA反射机制提供了什么功能 Java反射机制提供如下功能: 在运行时判断

5、任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判段任意一个类所具有的成员变量和方法 在运行时调用任一个对象的方法 在运行时创建新类对象 在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象。 这里首先定义用于测试的类:show sourceview sourceprint?01class Type 02public int pubIntField; 03public String pubStringField; 04private int prvIntField; 0506public Type() 07Log(Default Con

6、structor); 08 0910Type(int arg1, String arg2) 11pubIntField = arg1; 12pubStringField = arg2; 1314Log(Constructor with parameters); 15 1617public void setIntField(int val) 18this.prvIntField = val; 19 20public int getIntField() 21return prvIntField; 22 2324private void Log(String msg) 25System.out.pr

7、intln(Type: + msg); 26 27 2829class ExtendType extends Type 30public int pubIntExtendField; 31public String pubStringExtendField; 32private int prvIntExtendField; 3334public ExtendType() 35Log(Default Constructor); 36 3738ExtendType(int arg1, String arg2) 39pubIntExtendField = arg1; 40pubStringExten

8、dField = arg2; 4142Log(Constructor with parameters); 43 4445public void setIntExtendField(int field7) 46this.prvIntExtendField = field7; 47 48public int getIntExtendField() 49return prvIntExtendField; 50 5152private void Log(String msg) 53System.out.println(ExtendType: + msg); 54 551、获取类的Class对象Clas

9、s 类的实例表示正在运行的 Java 应用程序中的类和接口。获取类的Class对象有多种方式:调用getClassBoolean var1 = true; Class classType2 = var1.getClass(); System.out.println(classType2); 输出:class java.lang.Boolean运用.class 语法Class classType4 = Boolean.class; System.out.println(classType4); 输出:class java.lang.Boolean运用static method Class.for

10、Name()Class classType5 = Class.forName(java.lang.Boolean); System.out.println(classType5); 输出:class java.lang.Boolean运用primitive wrapper classes的TYPE 语法 这里返回的是原生类型,和Boolean.class返回的不同Class classType3 = Boolean.TYPE; System.out.println(classType3); 输出:boolean 2、获取类的Fields 可以通过反射机制得到某个类的某个属性,然后改变对应于这个

11、类的某个实例的该属性值。JAVA 的Class类提供了几个方法获取类的属性。public Field getField(String name)返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段public Field getFields()返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段public Field getDeclaredField(String name)返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段public Field getDe

12、claredFields()返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段show sourceview sourceprint?01Class classType = ExtendType.class; 0203/ 使用getFields获取属性 04Field fields = classType.getFields(); 05for (Field f : fields) 06 07System.out.println(f); 08 0910System.out.println(); 1112/ 使用getDeclaredFields获取

13、属性 13fields = classType.getDeclaredFields(); 14for (Field f : fields) 15 16System.out.println(f); 17输出: public int com.quincy.ExtendType.pubIntExtendField public java.lang.String com.quincy.ExtendType.pubStringExtendField public int com.quincy.Type.pubIntField public java.lang.String com.quincy.Type.pubStringField public int com.quincy.ExtendType.p

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 国内外标准规范

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号