java反射机制

 引子: 先思考一下我们如何使用java中的类?

 已知一个类的类名、以及、类中的方法属性、构造方法等
 使用new关键字创建对象
 使用对象调用方法或属性

问题: 如果仅仅知道一个类的类名,能否动态得到类的定义信息,包括哪些方法, 属性等?

答案:结果是当然可以,这就是我们需要谈到的反射机制。

java反射的概念和作用

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个
类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个
方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为
java语言的反射机制。(简而言之就是可以知道这个类的任何东西)

java反射相关的API

 Class 类型
 Constructor 构造方法
 Method 方法
 Field 属性
 除了Class外,其他类都位于java.lang.reflect包中
 可见,反射API将类的类型、方法、属性都封装成了类,其中最重要的类是
Class,可以说,反射的使用都是从Class开始。

关于class类

Class类是java反射的基础,通过Class类就可以得到这个类的基本信息

获得Class类的三种方式如图

首先创建了User类和Car类

方式一:通过Class.forName()方法将model.User包中的类以字符串的形式赋值

方式二:直接通过User.class;类名加class即可获得

方式三:通过这个对象的getClass()方法即可获得这个class类.

获得了class类如何知道类中的东西

1.构造方法(Constructor)

如图中所示,这是拿到了class这个类之后,通过这个类就可以用getConstructor拿到构造方法,注意构造方法也是一个对象,通过构造方法可以创建这个类的Object对象,对其的构造方法(有参无参私有不私有)都可以进行访问。

2.属性

如图中所示,这是拿到了class这个类之后,通过这个类创建这个对象,再通过这个类创建这个属性集合,将所有属性放进去后增强for循环遍历。这里我们模拟mybatis框架查询数据并赋值,这里我们先给name和password属性赋值,遍历出来的属性用setAccessible(true)可以修改私有属性,然后通过这个属性set(创建的这个对象,map找到这个属性名)为这个对象的属性进行了赋值操作,mybatis就可以通过select语句将查询出来的值,通过反射自动创建一个对象并给他赋值。

3.方法

getName:获得方法名字
getParameterTypes:获得方法参数类型

如图中所示,拿到了class类之后就可以创建一个对象,通过这个class类就能拿到类中的方法,然后使用。

反射优缺点

 优点:
1.增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作
2.提高代码的复用率,比如动态代理
3.可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射进行动态调用
缺点:
1.反射会涉及到动态类型的解析,导致性能要比非反射调用更低
2.使用反射技术通常要在一个没有安全限制的程序运行.
3.反射可以绕过一些限制访问的属性或者方法,可能会导致破坏代码本身的抽象

总结

我们通过反射就可以拿到这个类中的所有属性、所有构造方法、所有成员方法,并且还可以创建一个对象,通过反射为这个对象中的所有属性、构造方法、成员方法进行赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值