反射方法 的简单使用

反射方法 的简单使用

获得字节码文件对象的三种方式

首先第一句,一切皆对象。类、属性、方法、构造器都是对象

该篇文章其实就注重两个点、是否有declared前缀,带有private的记得调用setAccessible
所涉及到的类:Class、Field、Construcotr、Method

  1. Object类的getClass方法

  2. 类型.class 属性

  3. Class.forName(“类的路径”)

    image-20200607161433834

都为true,内存地址是一样的。在程序的运行中,Person的class文件只被加载了一次。
注意:除了反射案例。在此赠送一套最新Java架构项目实战教程+大厂面试题库,想学的 点击此处免费获取,小白勿进哦

image-20200607161626586

也为true,可知只加载了一次

image-20200607161907591

也为true

用字节码文件对象来构建一个类的对象

image-20200607162932098

字节码文件对象中包含:

那么 这4个字节码文件对象中叫什么呢?

java文件字节码文件
字节码文件对象
构造方法构造方法对象(类型Constructor)
成员变量成员变量对象(类型Field)
成员方法成员方法(类型Method)

之前一直用new的形式来创建一个类的对象

Person p = new Person()

加粗部分是类的构造方法,因为对象是通过构造方法创建的

用字节码文件中的构造器对象来创建一个类的对象——Constructor对象

image-20200607165151665

获得Constructor来创建对象

注意:getDeclaredConstructor(Class<?>… parameterTypes)
这个方法会返回指定参数类型的所有构造器,**包括public的和非public的,**当然也包括private的。
getDeclaredConstructors()的返回结果就没有参数类型的过滤了。

再来看getConstructor(Class<?>… parameterTypes)
这个方法返回的是上面那个方法返回结果的子集,只返回制定参数类型访问权限是public的构造器。
getConstructors()的返回结果同样也没有参数类型的过滤。

用反射有什么好处呢?之前Spring ioc有讲。可以通过配置文件动态创建对象:

来:

创建一个a.txt用来存储要创建对象的 全路径名称,之后读取这个字符串,用class.forName创建就可以了。以Person为例

image-20200607165644004

获取名称后也可创建对象。

构造方法对象

四个访问修饰符:

image-20200607171458965

image-20200607174759323

getConstrustors是获取公有的,所以只有一个

image-20200607174902268

getDeclaredConstructors这个就是得到所有的

获取指定的构造器

image-20200607175158291

这是public的,如果不是public,使用getConstructor获得指定方法机会报NoSuchMethodException

image-20200607175310534

所以也是用带Declared的getDeclaredConstructor

那么其他访问修饰符呢?

image-20200607180232347

私有的可以得到构造器,但是不能创建对象

image-20200607180338222

通过constructor.setAccessible(true)设置为可以访问

方法对象

它也有这些

image-20200607180610378

image-20200607180641434

其他方法是因为还有Object的,当然这是public的,要所有的需要加上Declared

先给Person加上getter与setter,以及该类的一个私有方法

image-20200607181104007

image-20200607181124194

可以发现有以下的区别

1.不带declared是得到所有的public修饰的method 包括从父类继承过来的Declared

2.带declared是得到当前类中的所有Method

image-20200607183830023

注意,getMethod()是得到公有的方法,同样的也有getDeclaredMethod()

同样的,如果将getName()这个方法的访问权限改为私有的,那么也将报 **IllegalAccessException **

image-20200607184211889

那么也是一样的,需要设置一下

image-20200607184320224

得到属性对象

getField跟getDeclaredField,跟上面的一样的。因为这里是private

image-20200607190400689

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值