继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

题目:java的反射机制

慕姐8265434
关注TA
已关注
手记 1275
粉丝 222
获赞 1065

问题:

在运行时,对一个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在包java.lang.reflect中,JDK 1.6.0的reflect包如下图:

webp

image.png


Member接口    该接口可以获取有关类成员(域或者方法)后者构造函数的信息。
AccessibleObject类   该类是域(field)对象、方法(method)对象、构造函数(constructor)对象的基础类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。
Array类  该类提供动态地生成和访问JAVA数组的方法。
Constructor类    提供一个类的构造函数的信息以及访问类的构造函数的接口。
Field类  提供一个类的域的信息以及访问类的域的接口。
Method类 提供一个类的方法的信息以及访问类的方法的接口。
Modifier类   提供了 static 方法和常量,对类和成员访问修饰符进行解码。
Proxy类  提供动态地生成代理类和类实例的静态方法。
对象的方法


在运行时创建新类对象

在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象。

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

View Code?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 classType{
publicintpubIntField;
publicString pubStringField;
privateintprvIntField;

publicType(){
    Log("Default Constructor");
}
  
Type(intarg1, String arg2){
    pubIntField = arg1;
    pubStringField = arg2;
      
    Log("Constructor with parameters");
}
  
publicvoidsetIntField(intval) {    this.prvIntField = val;
}
publicintgetIntField() {
    returnprvIntField;
}
  
privatevoidLog(String msg){
    System.out.println("Type:"+ msg);
}

}

classExtendTypeextendsType{
publicintpubIntExtendField;
publicString pubStringExtendField;
privateintprvIntExtendField;

publicExtendType(){
    Log("Default Constructor");
}   
  
ExtendType(intarg1, String arg2){      
    pubIntExtendField = arg1;
    pubStringExtendField = arg2;
      
    Log("Constructor with parameters");
}
  
publicvoidsetIntExtendField(intfield7) {    this.prvIntExtendField = field7;
}
publicintgetIntExtendField() {
    returnprvIntExtendField;
}
  
privatevoidLog(String msg){
    System.out.println("ExtendType:"+ msg);
}

}

1、获取类的Class对象

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。获取类的Class对象有多种方式:

|

调用getClass

|

Boolean 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.forName()

|

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

可以通过反射机制得到某个类的某个属性,然后改变对应于这个类的某个实例的该属性值。JAVA 的Class<T>类提供了几个方法获取类的属性。

|

public Field getField(String name)

|

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

|
|

public Field[] getFields()

|

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

|
|

public Field getDeclaredField(String name)

|

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

|
|

public Field[] getDeclaredFields()

|

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



作者:尚硅谷教育
链接:https://www.jianshu.com/p/295dd4fcada9


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP