目录
3、小结getClass()是定义在Object类中的,因此所有的对象都可以调用它
编辑1、什么是动态代理?动态代理可以无侵入式的给代码增加额外的功能
编辑①、示例代码BigStar.java(JavaBean)
编辑②、示例代码:(创建一个代理)ProxyUtil.java
一、什么是反射?
反射允许对封装类的字段,方法和构造函数的信息进行编程访问
换句话说就是(从类里拿出来)
可以获取到:(利用反射,我们可以获取到类中所有的东西)
获取是先从class字节码文件中获取的
二、获取class对象的三种方式![](https://i-blog.csdnimg.cn/blog_migrate/072d8f25b36521a16153025f40cdf45d.png)
三种方式也对应了三种阶段
1、Class.forName("全类名");
全类名 = 包名+类名
2、类名.class
3、对象.getClass();
4、代码实现
三种方式获取到的字节码文件对象其实是一样的
三、反射获取
1、利用反射获取构造方法
①、示例代码:![](https://i-blog.csdnimg.cn/blog_migrate/4d5fe283b99093f7c3eefee5f9c9021a.png)
②、获取所有的构造方法:![](https://i-blog.csdnimg.cn/blog_migrate/1e89f1aba49e5b3ba63823bca508ee66.png)
③、获取单个构造方法:
![](https://i-blog.csdnimg.cn/blog_migrate/fc7dfe0047e732c923dcc1a8225d41b6.png)
④、获取方法权限修饰符:
![](https://i-blog.csdnimg.cn/blog_migrate/fc523be0544ac3cebc0f0b4378104cc0.png)
⑤、获取参数个数、获取参数类型、获取所有参数:
⑥、获取私有:(暴力反射)
2、利用发射获取成员变量![](https://i-blog.csdnimg.cn/blog_migrate/18c9a3af69756b0b6223edcc411d2fa3.png)
①、获取class字节码文件的对象![](https://i-blog.csdnimg.cn/blog_migrate/bf4c68c8ffaa4fe62de7ff5945f4177b.png)
②、获取所有公共成员变量
![](https://i-blog.csdnimg.cn/blog_migrate/ee42e32dcc2911d7a3f529ad3b0e6290.png)
③、获取所有成员变量
![](https://i-blog.csdnimg.cn/blog_migrate/42026b8ff6cc719d5a53e720fbf8835a.png)
④、获取单个的成员变量
⑤、获取权限修饰符
![](https://i-blog.csdnimg.cn/blog_migrate/d779c19eccccb6b9794805f812bd1b9a.png)
⑥、获取成员变量的名字
![](https://i-blog.csdnimg.cn/blog_migrate/0b38d4b98ef1c57f0ff33cf62530a991.png)
⑦、获取成员变量的数据类型
![](https://i-blog.csdnimg.cn/blog_migrate/a28cc494fc2c4ff35d4b8f6afaec161e.png)
⑧、获取成员变量记录的值
![](https://i-blog.csdnimg.cn/blog_migrate/3162c5ffbf63798219c7057a9a53d0a6.png)
⑨、修改对象里面记录的值
![](https://i-blog.csdnimg.cn/blog_migrate/dc063730f6f4f80cae05b70b31f8ab48.png)
3、利用反射获取成员方法
①、获取class字节码文件对象
![](https://i-blog.csdnimg.cn/blog_migrate/287598bf19a7e4088b61339742e420b4.png)
②、获取里面所有的公共方法对象
包含父类中所有的公共方法
③、获取里面所有的方法对象
![](https://i-blog.csdnimg.cn/blog_migrate/5eeaaaafb15c9ad44b85e50977fe1bfc.png)
④、获取单个的方法
![](https://i-blog.csdnimg.cn/blog_migrate/924ec6fc1624c30bafeb7f551b201ea1.png)
⑤、获取方法的修饰符
![](https://i-blog.csdnimg.cn/blog_migrate/8ad83e11de45b42c5d78f4044d1f7f39.png)
⑥、获取方法的名字
![](https://i-blog.csdnimg.cn/blog_migrate/abbebf43ed686e004ac2ef56a0fdc435.png)
⑦、获取方法的形参
![](https://i-blog.csdnimg.cn/blog_migrate/d89ef10dc37117992d326df6b6ed1499.png)
⑧、获取方法的抛出的异常
![](https://i-blog.csdnimg.cn/blog_migrate/0024655c7ae5c94297b25e70698b8d48.png)
⑨、方法运行
四、反射的作用![](https://i-blog.csdnimg.cn/blog_migrate/5556aa535ac8c0785d65b1d06a93ee15.png)
1、练习1:保存信息![](https://i-blog.csdnimg.cn/blog_migrate/d38828314643ab306e69d442b6b34c37.png)
示例代码:
完整代码:(创建IO流存入本地文件)
2、练习2:跟配置文件结合动态创建![](https://i-blog.csdnimg.cn/blog_migrate/402d97e9ebbf081bfa9c1167fa4eac49.png)
示例代码:
(配置文件 prop.properties)
反射和配置文件结合,动态创建对象
老师:
3、小结
getClass()是定义在Object类中的,因此所有的对象都可以调用它
五、动态代理
![](https://i-blog.csdnimg.cn/blog_migrate/00c581aad40bb7431c52b81d8f5e91e0.png)
1、什么是动态代理?
动态代理可以无侵入式的给代码增加额外的功能
2、程序为什么需要代理?代理长什么样?
![](https://i-blog.csdnimg.cn/blog_migrate/e07a988a568cf4041042a0a81cf6ff92.png)
①、示例代码
BigStar.java(JavaBean)
Star.java(接口)
3、小结
![](https://i-blog.csdnimg.cn/blog_migrate/9a47a885b6c11857aa7120d62fc00521.png)
4、如何为Java对象创建一个代理对象?
①、newProxyInstance(1,2,3)
![](https://i-blog.csdnimg.cn/blog_migrate/5f8b901ef01d5c5920a694208cceb206.png)
②、示例代码:(创建一个代理)
ProxyUtil.java
参数一:固定格式
参数二:指定数组,如果有多个接口,可以将多个接口都放入数组
参数三:匿名内部类
测试类:
JavaBean(BigStar)
③、小结
1Java提供了什么API帮我们创建代理?
newProxyInstance(1,2,3)
newIProxyInstance方法在创建代理时,需要接几个参数,每个参数的含义是什么?
三个参数,参数1:用于指定用哪个类加载器
参数3: 用来指定生成的代理
参数2: 指定接口:
对象要干什么事情
通过invokehandler的invoke方法指定代理干的事时,这个invoke会被谁调用? 要接哪几个参数?
bigstar, argsll