黑马程序员技术交流社区

标题: 【石家庄校区】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