我的学习之路_第十四章_反射

类的反射


【获取class文件对象的三种方式】:


● 使用Object类中的方法  getClass()
Class<?>   getClass()   返回此Object的运行时类.


● 使用类名.class属性


每一个数据类型,基本数据类型和引用数据类型,Java都会为其设置一个class属性
例如: Class  class = int.class
     Class  class = String.class
     Class  class = Person.class
● 使用Class类中的静态方法forName


静态方法 返回值:Class<?> forName(String className)
返回与带有给定字符串名的类或接口相关联的Class对象.


★ 注意:每个类的class文件对象只会产生一次,是唯一的


【使用反射技术获取类中的构造方法并实例化】


实现步骤:
1.获取Person类的class文件对象
2.使用class文件对象中的方法  getConstructor   获取构造方法




Constructor<?>[] getConstructors()   获取类中所有的公共构造方法
Constructor<?>[] getDeclaredConstructors() 获取类中所有的构造方法,包含私有的


Constructor<T> getConstructor(Class<?>... parameterTypes) 获取指定的公共构造方法
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)  获取指定的构造方法,包含私有的


参数:
...  可变参数,可以有,可以没有
Class<?>...   parameterTypes:  构造方法参数的class对象


3.使用Constructor 中的方法   newInstrance   实例化构造方法


返回值:T newInstance(Object... initargs)
使用此Constructor 对象表示的构造方法来创建改构造方法的申明类的新势力,并用指定的初始化参数初始化该实例.


参数:
Object... initargs: 调用构造方法传递的实际参数
返回值:   Object: 不知道要创建的是哪个对象


私有化构造方法,无法直接执行,会抛出IlleagalAccessException非法权限异常
可以使用Constructor的父类AccessidleObject中有一个方法叫 setAccessible解决


没有返回值  setAccessible(boolean flay) 将此对象的 accessible 标志设置为指示的布尔值.
值为 true 则指示反射的对象在使用时应该取消Java语言访问检查
值为 false 则指示反射的对象应该实施Java语言访问检查
暴力反射:不推荐,破坏了类的封装性




【快速使用反射创建空参数对象的方法】


使用前提:
1.类中必须有空参数的构造方法
2.空参数的构造方法的修饰符不能是私有private,建议使用publie


在Class类中有一个方法


返回值:T newInstance()  创建此Class对象所表示的类的一个新实例.




【使用反射技术获取类中的成员变量(字段),给成员变量赋值,获取值】


步骤实现:
1.获取Person类的class文件对象
2.使用class文件对象中的getField获取成员变量


返回值:Field[]   getFields() 获取类中所有可访问公共字段
返回值:Field[] getDeclaredFields() 获取类中所有的申明字段,包含私有的


返回值:Field getField(String name) 获取类中指定公共成员字段
返回值:Field getDeclaredField(String name) 获取类中指定的申明字段,包含私有的


参数:   String name :  字段(成员变量)的名字


3.使用Field中的方法get/set 获取成员变量值,给成员变量赋值


返回值:Object get(Object obj) 返回指定对象上此Field 表示的字段的值
返回值:void set(Object obj,Objcet value) 将指定对象变量上此Field 对象表示的字段设置为指定的新值.


参数: Object obj: 要设置值/获取的值的对象,可以使用反射快速创建
Object value: 给成员变量设置的实际值
返回值: Object:获取成员变量的返回值




【使用反射技术获取类中的成员方法,并执行】


实现步骤:
1.获取Person类的class文件对象
2.使用class文件对象中的方法getMethod获取成员方法


返回值:Method[] getMethods() 获取类中所有的公共方法,包含继承父类的
返回值:Method[] getDeclaredMethods() 包含公共、保护、默认(包)访问和私有方法,但不包括继承的方法.


返回值:Menthod getMethod(String name ,Class<?>...ParameterTypes) 获取类中指定公共成员方法.
返回值Menthod getDeclaredMethod(String name,Class<?>...  parameterTypes) 获取类中指定的成员方法,包含私有


参数: String name: 方法的字符串名称
Class<?>... parameterTypes: 方法参数列表的class对象




3.使用Method中的方法 invoke 执行取到的方法


返回值:Object   invoke(Object obj,Object... args)
参数:
Object obj: 要执行的方法的所属对象
Object... args: 执行方法,传递的实际参数
返回值 Objcet : 方法的返回值     如果方法没有返回值,Object的值为null




Method类中的方法:getName,获取方法名称
返回值:String   getName()  以String形式返回此Method 对象表示的方法名称




【同时又很多类,我们也不知道创建那个类的对象,执行哪个类中的方法】
可以使用反射技术,实现创建不同的对象,执行不同的方法


实现步骤:


1.创建prop.peoperties配置文件,里边保存类名和方法名字(配置文件中要写全路径)
2.使用IO+Properties集合读取配置文件,把文件中的键值对保存到集合中
3.通过key获取value
4.使用获取的value中的类名使用反射技术创建对象
5.使用反射技术,获取方法,执行方法


【反射的综合案例】
通过反射技术,获取jababean的对象,给JavaBean的成员变量注入(赋)值


实现步骤:
1.创建JavaBean(User类)
2.创建data.properties配置文件,配置成员变量的实际使用的值
3.使用IO+Properties集合,读取配置文件,把文件中的数据保存到集合中
4.使用反射技术创建JavaBean对象
5.遍历Properties集合
6.使用Properties集合key拼接setxxx方法
类中的set方法:setId,setUsername,setPassword
集合的key:id,username,password
拼接的过程:1.固定的字符串:"set" 2.获取key的首字符,变成大写  3. 获取key的其他字母


7.使用反射技术获取setxxx方法
8.使用反射技术执行setxxx方法,给成员变量注入值




【使用反射技术获取接口】


返回值:Class<?>[]  getInterfaces() 确定此对象所表示的类或接口实现的接口


实现步骤:
1.获取接口实现类的class文件对象
2.会用Class中的方法getInterfaces获取实现的接口
3.使用接口class文件对象没创建实现类对象,调用实现类中的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值