关灯
开启左侧

Java反射机制

[复制链接]
秋名山车神 发表于 2018-5-25 17:01:45 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 

问题:
在运行时,对一个 JAVA 类,能否知道属性和方法;能否调用它的任意方法?
答案是可以的,JAVA 提供一种反射机制可以实现。
目录
1 什么是 JAVA 的反射机制
2 JDK 中提供的 Reflection  API
3 JAVA 反射机制提供了什么功能
o 获取类的 Class 对象 o 获取类的 Fields o 获取类的 Method
o 获取类的 Constructor o 新建类的实例
Class<T>的函数 newInstance
通过 Constructor 对象的方法 newInstance
4 调用类的函数
调用 private 函数
5 设置/获取类的属性值
private 属性
6 动态创建代理类动态代理源码分析
7 JAVA 反射 Class<T>类型源代码分析
8 JAVA 反射原理分析
Class 文件结构
JVM 加载类对象,对反射的支持 9 JAVA 反射的应用
一、什么是 JAVA 的反射机制
Java 反射是 Java 被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过 Reflection APIs 取得任何一个已知名称的 class 的内部信息,包括其
modifiers(诸如 public, static 等)、superclass (例如 Object)、实现之interfaces(例如 Cloneable),也包括 fields 和 methods 的所有信息,并可于运行时改变 fields 内容或唤起 methods。
Java 反射机制容许程序在运行时加载、探知、使用编译期间完全未知的 classes。
换言之,Java 可以加载一个运行时才得知名称的 class,获得其完整结构。
二、JDK 中提供的 Reflection API

Java 反射相关的 API 在包 [url=mkMSITStore:F:/JDK_API_1_6_zh_CN.CHM::/java/lang/reflect/package-summary.html]java.lang.reflect [/url]中,JDK 1.6.0的 reflect 包如下图:
file:///C:\Users\GXA\AppData\Local\Temp\ksohtml\wps54F4.tmp.png
Java反射机制.jpg

Member 接口 该接口可以获取有关类成员(域或者方法)后者构造函数的信息。
Accessibl 该类是域(field)对象、方法(method)对象、构造函数(constructor)对象 eObject 的基础类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控
制检查的能力。
Array 类        该类提供动态地生成和访问 JAVA 数组的方法。
Construct 提供一个类的构造函数的信息以及访问类的构造函数的接口。 or 类
Field 类        提供一个类的域的信息以及访问类的域的接口。
Method 类        提供一个类的方法的信息以及访问类的方法的接口。
Modifier        提供了 static 方法和常量,对类和成员访问修饰符进行解码。
Proxy         提供动态地生成代理类和类实例的静态方法。
三、JAVA 反射机制提供了什么功能
Java 反射机制提供如下功能:
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判段任意一个类所具有的成员变量和方法
在运行时调用任一个对象的方法

在运行时创建新类对象
在使用 Java 的反射功能时,基本首先都要获取类的 Class 对象,再通过 Class 对象获取其他的对象。
这里首先定义用于测试的类:
View Code?
1 classType{
2 publicintpubIntField;
3 publicString pubStringField;
4 privateintprvIntField;
5
6 publicType(){
7 Log("Default Constructor");
8 }
9
10 Type(intarg1, String arg2){
11 pubIntField = arg1;
12 pubStringField = arg2;
13
14 Log("Constructor with parameters");
15
}
16
17 publicvoidsetIntField(intval) {
18 this.prvIntField = val;
19 }
20 publicintgetIntField() {
21 returnprvIntField;
22 }
23
24 privatevoidLog(String msg){
25 System.out.println("Type:"+ msg);
26 }
27 }
28

29 classExtendTypeextendsType{
30 publicintpubIntExtendField;
31 publicString pubStringExtendField;
32 privateintprvIntExtendField;
33
34 publicExtendType(){
35 Log("Default Constructor");
36 }
37
38 ExtendType(intarg1, String arg2){
39 pubIntExtendField = arg1;
40 pubStringExtendField = arg2;
41
42 Log("Constructor with parameters");
43
}
44
45 publicvoidsetIntExtendField(intfield7) {
46 this.prvIntExtendField = field7;
47 }
48 publicintgetIntExtendField() {
49 returnprvIntExtendField;
50 }
51
52 privatevoidLog(String msg){
53 System.out.println("ExtendType:"+ msg);
54 }
55 }
1、获取类的 Class 对象
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。获取类的 Class 对象有多种方式:

Class<?> classType3 = Boolean.TYPE;
System.out.println(classType3);
输出:boolean
输出:class java.lang.Boolean
System.out.println(classType5);

        Boolean var1 = true;
getClass
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 Class<?> classType5 = Class.forName("java.lang.Boolean");
method Class.forNa
me()
primitive wrapper
classes 的 TYPE 语法
这里返回的是原生类型,和
Boolean.cla
ss 返回的不同
2、获取类的 Fields
可以通过反射机制得到某个类的某个属性,然后改变对应于这个类的某个实例的该属性值。 JAVA 的 Class<T>类提供了几个方法获取类的属性。
public [url=mkMSITStore:F:/JDK_API_1_6_zh_CN.CHM::/java/lang/reflect/Field.html]Field [/url]返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公 getField([url=mkMSITStore:F:/JDK_API_1_6_zh_CN.CHM::/java/lang/String.html]St [/url]共成员字段 [url=mkMSITStore:F:/JDK_API_1_6_zh_CN.CHM::/java/lang/String.html]ring [/url]name)
public 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表 [url=mkMSITStore:F:/JDK_API_1_6_zh_CN.CHM::/java/lang/reflect/Field.html]Field[/url][] 示的类或接口的所有可访问公共字段 getFields()
public [url=mkMSITStore:F:/JDK_API_1_6_zh_CN.CHM::/java/lang/reflect/Field.html]Field [/url]返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指 getDeclared 定已声明字段 Field([url=mkMSITStore:F:/JDK_API_1_6_zh_CN.CHM::/java/lang/String.html]Strin[/url]
[url=mkMSITStore:F:/JDK_API_1_6_zh_CN.CHM::/java/lang/String.html]g [/url]name)


public [url=mkMSITStore:F:/JDK_API_1_6_zh_CN.CHM::/java/lang/reflect/Field.html]Field[/url][] getDeclared Fields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段




 

精彩评论1

正序浏览
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

排行榜
关闭

站长推荐上一条 /1 下一条

官方微信

全国服务热线:

400-0708-360

公司地址:国家西部信息安全产业基地(成都市高新区云华路333号)

邮编:610000    Email:2908503813@qq.com

Copyright   ©2015-2016  安仔IT技术交流论坛Powered by©Discuz!    ( 蜀ICP备11000634号-7 )