Java学习之二Java反射机制.docx

上传人:b****6 文档编号:7204808 上传时间:2023-05-11 格式:DOCX 页数:21 大小:54.59KB
下载 相关 举报
Java学习之二Java反射机制.docx_第1页
第1页 / 共21页
Java学习之二Java反射机制.docx_第2页
第2页 / 共21页
Java学习之二Java反射机制.docx_第3页
第3页 / 共21页
Java学习之二Java反射机制.docx_第4页
第4页 / 共21页
Java学习之二Java反射机制.docx_第5页
第5页 / 共21页
Java学习之二Java反射机制.docx_第6页
第6页 / 共21页
Java学习之二Java反射机制.docx_第7页
第7页 / 共21页
Java学习之二Java反射机制.docx_第8页
第8页 / 共21页
Java学习之二Java反射机制.docx_第9页
第9页 / 共21页
Java学习之二Java反射机制.docx_第10页
第10页 / 共21页
Java学习之二Java反射机制.docx_第11页
第11页 / 共21页
Java学习之二Java反射机制.docx_第12页
第12页 / 共21页
Java学习之二Java反射机制.docx_第13页
第13页 / 共21页
Java学习之二Java反射机制.docx_第14页
第14页 / 共21页
Java学习之二Java反射机制.docx_第15页
第15页 / 共21页
Java学习之二Java反射机制.docx_第16页
第16页 / 共21页
Java学习之二Java反射机制.docx_第17页
第17页 / 共21页
Java学习之二Java反射机制.docx_第18页
第18页 / 共21页
Java学习之二Java反射机制.docx_第19页
第19页 / 共21页
Java学习之二Java反射机制.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Java学习之二Java反射机制.docx

《Java学习之二Java反射机制.docx》由会员分享,可在线阅读,更多相关《Java学习之二Java反射机制.docx(21页珍藏版)》请在冰点文库上搜索。

Java学习之二Java反射机制.docx

Java学习之二Java反射机制

Java学习之二-Java反射机制

问题:

在运行时,对一个JAVA类,能否知道属性和方法;能否调用它的任意方法?

答案是可以的,JAVA提供一种反射机制可以实现。

 

目录

1.什么是JAVA的反射机制

2.JDK中提供的ReflectionAPI

3.JAVA反射机制提供了什么功能

4.获取类的Class对象

5.获取类的Fields

6.获取类的Method

7.获取类的Constructor

8.新建类的实例

      Class的函数newInstance

      通过Constructor对象的方法newInstance

9.调用类的函数

        调用private函数

10.设置/获取类的属性值

        private属性

11.动态创建代理类

        动态代理源码分析

12.JAVA反射Class类型源代码分析

13.JAVA反射原理分析

       Class文件结构

       JVM加载类对象,对反射的支持

14.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对象获取其他的对象。

这里首先定义用于测试的类:

showsourceviewsourceprint?

01

classType{

02

    publicintpubIntField;

03

    publicStringpubStringField;

04

    privateintprvIntField;

05

      

06

    publicType(){

07

        Log("DefaultConstructor");

08

    }

09

      

10

    Type(intarg1,Stringarg2){

11

        pubIntField=arg1;

12

        pubStringField=arg2;

13

          

14

        Log("Constructorwithparameters");

15

    }

16

      

17

    publicvoidsetIntField(intval){

18

        this.prvIntField=val;

19

    }

20

    publicintgetIntField(){

21

        returnprvIntField;

22

    }

23

      

24

    privatevoidLog(Stringmsg){

25

        System.out.println("Type:

"+msg);

26

    }

27

}

28

  

29

classExtendTypeextendsType{

30

    publicintpubIntExtendField;

31

    publicStringpubStringExtendField;

32

    privateintprvIntExtendField;

33

      

34

    publicExtendType(){

35

        Log("DefaultConstructor");

36

    }   

37

      

38

    ExtendType(intarg1,Stringarg2){      

39

        pubIntExtendField=arg1;

40

        pubStringExtendField=arg2;

41

          

42

        Log("Constructorwithparameters");

43

    }

44

      

45

    publicvoidsetIntExtendField(intfield7){

46

        this.prvIntExtendField=field7;

47

    }

48

    publicintgetIntExtendField(){

49

        returnprvIntExtendField;

50

    }

51

      

52

    privatevoidLog(Stringmsg){

53

        System.out.println("ExtendType:

"+msg);

54

    }

55

}

 

1、获取类的Class对象

Class类的实例表示正在运行的Java应用程序中的类和接口。

获取类的Class对象有多种方式:

调用getClass

Booleanvar1=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);        

输出:

boolean

 

2、获取类的Fields

可以通过反射机制得到某个类的某个属性,然后改变对应于这个类的某个实例的该属性值。

JAVA的Class类提供了几个方法获取类的属性。

publicFieldgetField(Stringname)

返回一个Field对象,它反映此Class对象所表示的类或接口的指定公共成员字段

publicField[]getFields()

返回一个包含某些Field对象的数组,这些对象反映此Class对象所表示的类或接口的所有可访问公共字段

publicFieldgetDeclaredField(Stringname)

返回一个Field对象,该对象反映此Class对象所表示的类或接口的指定已声明字段

publicField[]getDeclaredFields()

返回Field对象的一个数组,这些对象反映此Class对象所表示的类或接口所声明的所有字段

 

showsourceviewsourceprint?

01

Class

>classType=ExtendType.class;

02

              

03

//使用getFields获取属性

04

Field[]fields=classType.getFields();

05

for(Fieldf:

fields)

06

{

07

    System.out.println(f);

08

}

09

  

10

System.out.println();

11

              

12

//使用getDeclaredFields获取属性

13

fields=classType.getDeclaredFields();

14

for(Fieldf:

fields)

15

{

16

    System.out.println(f);

17

}

 

输出:

publicintcom.quincy.ExtendType.pubIntExtendField

publicjava.lang.Stringcom.quincy.ExtendType.pubStringExtendField

publicintcom.quincy.Type.pubIntField

publicjava.lang.Stringcom.quincy.Type.pubStringField

publicintcom.quincy.ExtendType.pubIntExtendField

publicjava.lang.Stringcom.quincy.ExtendType.pubStringExtendField

privateintcom.quincy.ExtendType.prvIntExtendField

可见getFields和getDeclaredFields区别:

getFields返回的是申明为public的属性,包括父类中定义,

getDeclaredFields返回的是指定类定义的所有定义的属性,不包括父类的。

 

3、获取类的Method

通过反射机制得到某个类的某个方法,然后调用对应于这个类的某个实例的该方法

Class类提供了几个方法获取类的方法。

publicMethodgetMethod(Stringname,Class

>...parameterTypes)

返回一个Method对象,它反映此Class对象所表示的类或接口的指定公共成员方法

publicMethod[]getMethods()

返回一个包含某些Method对象的数组,这些对象反映此Class对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共member方法

publicMethodgetDeclaredMethod(Stringname,Class

>...parameterTypes)

返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定已声明方法

publicMethod[]getDeclaredMethods()

返回Method对象的一个数组,这些对象反映此Class对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

 

showsourceviewsourceprint?

01

//使用getMethods获取函数 

02

Class

>classType=ExtendType.class;

03

Method[]methods=classType.getMethods();

04

for(Methodm:

methods)

05

{

06

    System.out.println(m);

07

}

08

  

09

System.out.println();

10

  

11

//使用getDeclaredMethods获取函数 

12

methods=classType.getDeclaredMethods();

13

for(Methodm:

methods)

14

{

15

    System.out.println(m);

16

}

输出:

publicvoidcom.quincy.ExtendType.setIntExtendField(int)

publicintcom.quincy.ExtendType.getIntExtendField()

publicvoidcom.quincy.Type.setIntField(int)

publicintcom.quincy.Type.getIntField()

publicfinalnativevoidjava.lang.Object.wait(long)throwsjava.lang.InterruptedException

publicfinalvoidjava.lang.Object.wait()throwsjava.lang.InterruptedException

publicfinalvoidjava.lang.Object.wait(long,int)throwsjava.lang.InterruptedException

publicbooleanjava.lang.Object.equals(java.lang.Object)

publicjava.lang.Stringjava.lang.Object.toString()

publicnativeintjava.lang.Object.hashCode()

publicfinalnativejava.lang.Classjava.lang.Object.getClass()

publicfinalnativevoidjava.lang.Object.notify()

publicfinalnativevoidjava.lang.Object.notifyAll()

privatevoidcom.quincy.ExtendType.Log(java.lang.String)

publicvoidcom.quincy.ExtendType.setIntExtendField(int)

publicintcom.quincy.ExtendType.getIntExtendField()

 

4、获取类的Constructor

通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例 

Class类提供了几个方法获取类的构造器。

publicConstructorgetConstructor(Class

>...parameterTypes)

返回一个Constructor对象,它反映此Class对象所表示的类的指定公共构造方法

publicConstructor

>[]getConstructors()

返回一个包含某些Constructor对象的数组,这些对象反映此Class对象所表示的类的所有公共构造方法

publicConstructorgetDeclaredConstructor(Class

>...parameterTypes)

返回一个Constructor对象,该对象反映此Class对象所表示的类或接口的指定构造方法

publicConstructor

>[]getDeclaredConstructors()

返回Constructor对象的一个数组,这些对象反映此Class对象表示的类声明的所有构造方法。

它们是公共、保护、默认(包)访问和私有构造方法

 

showsourceviewsourceprint?

01

//使用getConstructors获取构造器  

02

Constructor

>[]constructors=classType.getConstructors();

03

for(Constructor

>m:

constructors)

04

{

05

    System.out.println(m);

06

}

07

              

08

System.out.println();

09

              

10

//使用getDeclaredConstructors获取构造器   

11

constructors=classType.getDeclaredConstructors();

12

for(Constructor

>m:

constructors)

13

{

14

    System.out.println(m);

15

}

16

  

17

输出:

18

publiccom.quincy.ExtendType()

19

  

20

publiccom.quincy.ExtendType()

21

com.quincy.ExtendType(int,java.lang.String)

 

5、新建类的实例

通过反射机制创建新类的实例,有几种方法可以创建

调用无自变量ctor

1、调用类的Class对象的newInstance方法,该方法会调用对象的默认构造器,如果没有默认构造器,会调用失败.

Class

>classType=ExtendType.class;

Objectinst=classType.newInstance();

System.out.println(inst);

输出:

Type:

DefaultConstructor

ExtendType:

DefaultConstructor

com.quincy.ExtendType@d80be3

 

2、调用默认Constructor对象的newInstance方法

Class

>classType=ExtendType.class;

Constructor

>constructor1=classType.getConstructor();

Objectinst=constructor1.newInstance();

System.out.println(inst);

输出:

Type:

DefaultConstructor

ExtendType:

DefaultConstructor

com.quincy.ExtendType@1006d75

调用带参数ctor

3、调用带参数Constructor对象的newInstance方法

Constructor

>constructor2=

classType.getDeclaredConstructor(int.class,String.class);

Objectinst=constructor2.newInstance(1,"123");

System.out.println(inst);

输出:

Type:

DefaultConstructor

ExtendType:

Constructorwithparameters

com.quincy.ExtendType@15e83f9

 

6、调用类的函数

通过反射获取类Method对象,调用Field的Invoke方法调用函数。

showsourceviewsourceprint?

01

Class

>classType=ExtendType.class;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2