Java反射机制

目录

1、反射机制的具体实现(重点)

1.1:通过getClass()方法

1.2:通过.class静态属性

1.3:通过Class类中的静态方法forName()

2、通过类对象获取构造方法并且实例化

通过类对象获取构造方法的方法有很多:

通过Constructor对象实例化

3、通过类对象获取Field对象并且进行赋值和获取

 通过类对象获取属性的方法有很多:​

通过Field对象操作属性对象

 4、通过类对象获取Method对象并且调用

 通过类对象获取Method的方法有很多:

通过Method对象调用方法 

 案例:


首先需要声明:部分图片来自百战尚学堂

动态语言是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如JavaScript、Python都是典型的动态语言,而C、C++、Java等语言则不属于动态语言。

而Java通过反射机制实现了动态语言,Java不是动态语言,但Java可以称之为“半动态语言”。即Java有一定的动态性,我们可以利用反射机制获得类似动态语言的特性。Java的动态性让编程的时候更加灵活。”

而实现反射机制最重要的一步是获取类对象,因为只有我们获取了类对象才能获取类的结构,才能通过类对象对属性进行赋值,方法进行调用

1、反射机制的具体实现(重点)

获取类对象的三种方式:

首先我们需要有一个类进行模拟,这里我们就是用Users类进行模拟

1.1:通过getClass()方法

首先我们需要清楚地是,当我们运行程序时,JVM会在自己的内存区创建类对象,而一个类就对应了一个类对象,不能多也不能少

不能多是因为如果我们没实例化一个对象都需要加载一次类对象,那么不就造成了内存浪费吗,都是同样的代码为啥加载n次

我们可以通过代码来看看,此时我们通过对象.getClass()的方法获取类对象,那么我们判断一下就可以知道虽然我们创建了两个类对象的引用,但是这两个引用都是指向了同一个Users类对象,我们对这两个类对象的引用进行判断,返回结果是ture,这就说明了这两个引用同时指向了同一个类对象 

1.2:通过.class静态属性

我们也可以通过类对象的class静态属性获取类对象,此时我们也可以看到两个引用都是指向了同一个对象,就说明JVM只会加载一次类对象

此时我们得注意我们并没有创建Users对象,那么JVM就没有在堆中加载类,所有这里JVM会先找到Users类加载他,然后获取这个类的类对象 

1.3:通过Class类中的静态方法forName()

我们也可以通过Class类下的静态方法forName()获取类对象,但是这个静态方法需要给定参数,参数是类的全名 

2、通过类对象获取构造方法并且实例化

通过类对象获取构造方法的方法有很多:

getDeclaredConstructors()返回包含所有构造方法的Constructor对象类型数组

getConstructors()只返回包含public修饰的Constructor对象类型数组,其他不返回

getConstructor(Class<?>… parameterTypes)根据构造方法的参数返回public修饰的一个构造方法对象

getDeclaredConstructor(Class<?>… parameterTypes)根据构造方法的参数获取一个构造方法对象

构造方法对象就是Constructor对象,就是构造方法的对象类型

我们都来用一下:

通过Constructor对象实例化

我们还可以通过获得的构造方法对象进行实例化获得Users对象,这里我们就需要用到newInstance()方法

3、通过类对象获取Field对象并且进行赋值和获取

 通过类对象获取属性的方法有很多:

getFields()返回public修饰的所有Field对象数组

getDeclaredFields()返回所有Field对象数组

getField(String fieldName)通过成员变量的名字返回public修饰的指定的Field对象

getDeclaredField(String fieldName)通过成员变量返回指定的Field对象

Field对象就是成员变量的对象类型

我们来都用一下:

通过Field对象操作属性对象

此时我们可以看到当我们操作属性对象的时候会先实例化Users对象,这是因为一个类可以有多个实例化,那么我么如果要给userage赋值我们要给哪个Users对象赋值呢?

计算机不知道,所以我们需要告诉他,不管是赋值还是获取数据,我们都需要告诉他我们是对哪个对象进行操作

 4、通过类对象获取Method对象并且调用

 通过类对象获取Method的方法有很多:

 

getMethods()返回所有public修饰的方法对应的Method对象数组(包含所有父类的方法)

getDeclaredMethods()返回所有方法对应的Method对象数组

getMethod(String name,Class<?>…parameterTypes)

通过方法名和参数类型返回public修饰的方法对应的Method对象

getDeclaredMethods(String name,Class<?>…parameterTypes)

通过方法名和参数类型返回方法对应的Method对象

我们都来试一下:

getMethods()是一个非常特殊的方法,他不仅会获取类对象中public修饰的Method对象还会获取父类的方法

 我们就来获取这两个方法(这里有个错误,这个是构造方法所以不能通过getMethod获取,只能获取构造方法以外的方法)

通过Method对象调用方法 

这里我们就要使用到invoke方法,不管我们是调用方法还是获取/设置属性值,都是需要给定我们要操作的对象的,因为一个类是可以实例化多次的

此时这个方法对象对应的是setUsername()方法

 案例:

到了这里我们就已经把反射机制大部分重点内容学完了,现在我们来写一个案例,实现动态运行,让我们输入方法名来控制方法的调用顺序 

测试:

这样子我们就实现了简单的动态执行方法的效果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java反射机制是指在运行时动态地获取一个类的信息,并可以操作类的属性、方法和构造器等。Java反射机制可以使程序员在运行时动态地调用类的方法和属性,扩展类的功能,并可以实现注解、工厂模式以及框架开发等。 Java反射机制的原理如下:首先,Java编译器将Java源代码编译为字节码文件,字节码文件中包含着类的信息,这些信息包括类的名称、方法、属性和构造器等等。接着,Java虚拟机将字节码文件加载到内存中,然后通过类加载器将类加载到内存中形成一个类对象,这个类对象可以操作字节码文件中的信息。 使用Java反射机制的过程如下:首先获取类对象,通过类对象来获取类的构造器、属性、方法等信息,然后调用构造器来创建对象,通过属性获取和设置类的成员属性,通过方法调用类的方法等。 Java反射机制的优点是可以在运行时动态地得到类的信息,使得程序员在程序运行时能够对类进行更加灵活的操作,并可以使得程序更加通用化,同时也存在着一定的性能问题,因为Java反射机制需要Java虚拟机进行一定的额外处理,所以在程序运行时需要进行额外的时间和资源消耗。 总之,Java反射机制Java语言的一项重要特性,在Java开发中广泛应用,在代码编写、框架开发以及API开发中具有重要作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值