反射
反射:
在运行时,可以获得任意一个类或对象的所有方法(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方法可以返回所有类型的方法,但是不能返回继承来的方法
单个声明或者说声明特定值需要写参数,如果返回的是数组就不需要