黑马程序员技术交流社区
标题:
【石家庄校区】JavaEE个人学习总结day13-反射
[打印本页]
作者:
sun2ice
时间:
2018-1-4 17:10
标题:
【石家庄校区】JavaEE个人学习总结day13-反射
本帖最后由 sun2ice 于 2018-1-4 17:33 编辑
#反射
* 在运行时,我们可以获取任意一个类的所有方法和属性
* 在运行时,我们可以调用人一个对象的所有方法和属性
* 前提
* 获取类的对象(Class对象-->字节码对象)
* 类名.class ;属性
* 对象.getClass() ;
* Class.forName(全类名);
##通过反射来获取某一个类的构造器:
* 步骤:
* 1):获取该类的字节码对象.
* 2):从该字节码对象中去找需要获取的构造方法
* Class类获取构造器方法:
```
Constructor类:表示类中构造器的类型,Constructor的实例就是某一个类中的某一个构造
Constructor<?>[] getConstructors():该方法只能获取当前Class所表示类的public修饰的构造
Constructor<?>[] getDeclaredConstructors():获取当前Class所表示类的所有的构造,和访问权限无关
Constructor<T> getConstructor(Class<?>... parameterTypes) :获取当前Class所表示类中指定的一个public的构造 空即是无参构造
参数:parameterTypes表示:构造器参数的Class类型
如:public User(String name)
Constructor c = clz.getConstructor(String.class);
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) :获取当前Class所表示类中指定的一个的构造
构造器最大的作用:创建对象.
为什么使用反射创建对象,为什么不直接来new呢?
在框架中,提供给我们的都是字符串.
```
##使用反射创建对象:
* 步骤:
* 1);找到构造器所在类的字节码对象.
* 2):获取构造器对象.
* 3):使用反射,创建对象
```
Constructor<T>类:表示类中构造器的类型,Constructor的实例就是某一个类中的某一个构造器
常用方法:
T newInstance(Object... initargs):如调用带参数的构造器,只能使用该方式.
参数:initargs:表示调用构造器的实际参数
返回:返回创建的实例,T表示Class所表示类的类型
如果:一个类中的构造器是外界可以直接访问,同时没有参数.,那么可以直接使用Class类中的newInstance方法创建对象.
Object newInstance():相当于new 类名();
调用私有的构造器:
```
##获取成员属性
* 步骤
* 获取类字节码对象
* 获取对象
* 获取该类中需要操作的字段(成员变量)
* getDeclaredFields()方法获取包括私有字段
* getFields()方法获取公共字段
* 私有 通过setAccessible()让jvm不检查权限
* 通过set方法设置对象为具体的值
* 获取成员属性
```
Field[] getFields(): 获取所有public的成员变量
Field[] getDeclaredFields(): 获取所有权限的成员变量, 包括private的
Field[] getField(String fieldName): 通过指定的成员变量名获取指定的public的成员变量
Field[] getDeclaredField(String fieldName`: 通过指定的成员变量名获取指定的所有权限的成员变量, 包括private的
```
##获取类中的方法并调用:
* 步骤:
* 获取方法所在类的字节码对象.
* 获取方法.
* 获取类中的方法
* 使用反射调用方法.
```
Method[] getMethods():获取包括自身和继承过来的所有的public方法
Method[] getDeclaredMethods():获取自身类中所有的方法(不包括继承的,和访问权限无关)
Method getMethod(String methodName,Class<?>... parameterTypes):表示调用指定的一个公共的方法(包括继承的)
参数:methodName: 表示被调用方法的名字
parameterTypes:表示被调用方法的参数的Class类型如String.class
Method getDeclaredMethod(String name,Class<?>... parameterTypes):表示调用指定的一个本类中的方法(不包括继承的)
参数:methodName: 表示被调用方法的名字
parameterTypes:表示被调用方法的参数的Class类型如String.class
invoke(Object obj, Object... args)`: 调用指定对象的成员方法
参数:obj: 表示被调用方法底层所属对象
args:表示调用方法是传递的实际参数
调用私有方法:
.setAccessible(true);
```
##使用反射调用静态方法:
静态方法不属于任何对象,静态方法属于类本身.
此时把invoke方法的第一个参数设置为null即可.
使用反射调用数组参数(可变参数):
王道:调用方法的时候把实际参数统统作为Object数组的元素即可.
```
Method对象.invoke(方法底层所属对象,new Object[]{ 所有实参 });
```
##JavaBean
* 类使用公共进行修饰
* 提供私有成员变量
* 为成员提供公共的get set 方法
* 提供无参构造
* 实现序列化接口(Serializable
* 给出序列化ID private static final long serialVersionUID = 1L;
##BeanUtils
* Apache commons 提供的一个组件,主要功能是为了简化JavaBean封装数据的操作
```
* 静态方法
* `static void setProperty(Object bean, String name, Object value)`: 给JavaBean对象的成员属性赋值, 传入对象, 成员属性名, 属性值
* `static String getProperty(Object bean, String name)`: 获取JavaBean成员属性的属性值, 传入对象, 成员属性名, 返回属性值的字符串形式
* `static void populate(Object bean, Map properties)`: 给JavaBean对象的成员属性赋值, 传入对象, Map的key是属性名, value是属性值
*以上底层为反射
```
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2