反射

反射:
在运行时,可以获得任意一个类或对象的所有方法(private的也能获取(待定))和属性(就是三种方法从class文件(字节码文件)中获取文件中的各种关于类的信息,然后可以用来创建对象
通过对应类的字节码文件获得类的方法和属性(作用:比如可以通过某些方法,匹配相应的信息)
获得CLass对象)
应用场景:
学习框架,框架的底层会大量使用反射.SSH
调用配置文件
前提:
获取类的对象(Class(字节码)对象)
获取方式(3种):
通过Object的getClass方法,必须要有对象,返回值是Class对象
目标类的class属性,返回值是Class对象
Class类的forName方法,返回值时Class对象(推荐使用)

CLass:
 Constructor<?>[] getConstructors()  获取所有的构造方法(public修饰的)
 Constructor<T> getConstructor(Class<?>... parameterTypes)
 获取有参或者无参的构造方法

Constructor:
T newInstance(Object... initargs)  
获取Constructor的实例,实例的构造方法参数与Constructor的参数相同

方式二:
 T newInstance()
 使用CLass的方法创建无参的对象

注:
用getConstructor方法,里面填的参数是对应属性类型的class属性,而不是具体值或者直接的数据类型,因为里面传的参数是Class<?>... parameterTypes,是数据类型的class属性。

通过反射获得成员变量
Class:
 Field getField(String name) 获取公共的属性(自动匹配参数的值,如果有就返回指定的属性)
 Field[] getFields()  获取所有公共的属性
 Field getDeclaredField(String name) 获取属性(包括私有,自动匹配参数的值,如果有就返回指定的属性)
 Field[] getDeclaredFields()  获取所有的属性(包括私有)
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)  获取构造方法(包括私有)
Filed:

void set(Object obj, Object value)  对获取的Field进行设置属性值
Object get(Object obj)  获取指定field的属性值

AccessibleObject:Field的基类:暴力访问
 void setAccessible(boolean flag) 如果flag为true,就取消Java设置的访问权限
 
Method getMethod(String name, Class<?>... parameterTypes)  
获取方法,传入方法名,如果有参数就传入参数类型的字节码属性
Method[] getMethods()  


JavaBean:
用于封装数据,就是类= =

BeanUtils
 static void setProperty(Object bean, String name, Object value)
 static String getProperty(Object bean, String name)
这两个方法底层是JavaBean中的set和get方法
 static void populate(Object bean, Map properties)
将map中的映射关系传到JavaBean中

如果赋的值是由父类继承过来的,还能用这个方法吗


反射的好处:
1.三种方式,class,getClass,forName,可以在不知道JavaBean的类型的情况下获取其中的数据,也可以创建对象获取数据,也可以不知道类型
2.可以在不知道属性类型的情况下设置或者获取属性值

Declared方法和普通方法的区别:
普通的方法只能返回被public修饰的方法,但是可以返回所有继承来的父类的方法
Declared方法可以返回所有类型的方法,但是不能返回继承来的方法

单个声明或者说声明特定值需要写参数,如果返回的是数组就不需要

posted @ 2018-02-12 22:43  Shuu_丶  阅读(162)  评论(0编辑  收藏  举报