Java反射机制详解文档格式.docx
《Java反射机制详解文档格式.docx》由会员分享,可在线阅读,更多相关《Java反射机制详解文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
Class文件结构
JVM加载类对象,对反射的支持
9.JAVA反射的应用
一、什么是JAVA的反射机制
Java反射是Java被视为动态(或准动态)语言的一个关键性质。
这个机制允许程序在运行时透过ReflectionAPIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public,static等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。
Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。
换言之,Java可以加载一个运行时才得知名称的class,获得其完整结构。
二、JDK中提供的ReflectionAPI
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的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象。
这里首先定义用于测试的类:
[java]
viewplain
copy
print?
1.class
Type{
2.
public
int
pubIntField;
3.
String
pubStringField;
4.
private
prvIntField;
5.
6.
Type(){
7.
Log("
Default
Constructor"
);
8.
}
9.
10.
Type(int
arg1,
arg2){
11.
pubIntField
=
arg1;
12.
pubStringField
arg2;
13.
14.
Constructor
with
parameters"
15.
16.
17.
void
setIntField(int
val)
{
18.
this.prvIntField
val;
19.
20.
getIntField()
21.
return
22.
23.
24.
Log(String
msg){
25.
System.out.println("
Type:
"
+
msg);
26.
27.}
28.
29.class
ExtendType
extends
30.
pubIntExtendField;
31.
pubStringExtendField;
32.
prvIntExtendField;
33.
34.
ExtendType(){
35.
36.
37.
38.
ExtendType(int
39.
pubIntExtendField
40.
pubStringExtendField
41.
42.
43.
44.
45.
setIntExtendField(int
field7)
46.
this.prvIntExtendField
field7;
47.
48.
getIntExtendField()
49.
50.
51.
52.
53.
ExtendType:
54.
55.}
1、获取类的Class对象
Class类的实例表示正在运行的Java应用程序中的类和接口。
获取类的Class对象有多种方式:
调用getClass
Booleanvar1=true;
Class<
?
>
classType2=var1.getClass();
System.out.println(classType2);
输出:
classjava.lang.Boolean
运用.class语法
classType4=Boolean.class;
System.out.println(classType4);
运用staticmethodClass.forName()
classType5=Class.forName("
java.lang.Boolean"
System.out.println(classType5);
运用primitivewrapperclasses的TYPE语法
这里返回的是原生类型,和Boolean.class返回的不同
classType3=Boolean.TYPE;
System.out.println(classType3);
boolean
2、获取类的Fields
可以通过反射机制得到某个类的某个属性,然后改变对应于这个类的某个实例的该属性值。
JAVA的Class<
类提供了几个方法获取类的属性。
FieldgetField(String
name)
返回一个Field对象,它反映此Class对象所表示的类或接口的指定公共成员字段
Field[]getFields()
返回一个包含某些Field对象的数组,这些对象反映此Class对象所表示的类或接口的所有可访问公共字段
FieldgetDeclaredField(Stringname)
返回一个Field对象,该对象反映此Class对象所表示的类或接口的指定已声明字段
Field[]getDeclaredFields()
返回Field对象的一个数组,这些对象反映此Class对象所表示的类或接口所声明的所有字段
1.Class<
classType
ExtendType.class;
3.//
使用getFields获取属性
4.Field[]
fields
classType.getFields();
5.for
(Field
f
:
fields)
6.{
System.out.println(f);
8.}
10.System.out.println();
12.//
使用getDeclaredFields获取属性
13.fields
classType.getDeclaredFields();
14.for
15.{
17.}
publicintcom.quincy.ExtendType.pubIntExtendField
publicjava.lang.Stringcom.quincy.ExtendType.pubStringExtendField
publicintcom.quincy.Type.pubIntField
publicjava.lang.Stringcom.quincy.Type.pubStringField
privateintcom.quincy.ExtendType.prvIntExtendField
可见getFields和ge