反射
1.什么是反射
反射允许对成员变量,成员方法,构造方法的信息进行编程访问
2.如何获取字节码文件对象
class.forName(全类名)
类名.class;
类对象.getClass();
3.反射的优缺点
优点:
1.提高程序灵活性和扩展性
2.降低耦合性
3.允许程序创建和控制任何类的对象,无需提前硬编码目标类
缺点:
1.反射机制主要应用载对灵活性和拓展性很强的框架上,普通程序不建议使用
2.不好维护
4.反射的使用步骤
1.获取Class对象
2.获取Class对象的每个成员对象(属性,方法,构造)
3.操作成员对象
5.反射获取构造方法(Constructor对象)
1.Constructors [] getConstructors()获取public的所有构造器的数组
2.Constructors []getDeclaredConstructors()获取所有构造器的数组
3.getgetConstructor()获取单个public构造器(指定参数)
4.getDeclaredConstructo()获取单个的构造器(指定参数)
常用方法
newInstance(Object)根据指定构造器创建对象
setAccessible(boolean)设置为true,破坏封装,允许暴力访问(私有的构造实例化前必须开启暴力访问)
6.反射获取成员变量(Field)
1.Field [] getFields()获取所有public的成员变量对象的数组
2.Field [] getDeclaredFields()获取所有的成员变量对象的数组
3. getField(String name)获取一个指定的public的成员变量对象的数组
4. getDeclaredField(String name)获取一个指定的的成员变量对象的数组
常用方法
1.set(Object obj,Object value)给成员变量赋值
2.get(Object obj)获取值
3.setAccessible(boolean)设置为true,破坏封装,允许暴力访问(私有的成员变量赋值和取值前必须开启暴力访问)
7.反射获取成员方法(Method)
1.Method [] getMethods()获取所有public的成员方法对象的数组
2.Method [] getDeclaredMethods()获取所有的成员方法对象的数组
3. getMethod(方法名,参数)获取单个指定的public的成员方法对象
4.getDeclaredMethod(方法名,参数)获取单个指定的成员方法对象
常用方法
1.返回值 invoke(使用方法的对象,使用方法的参数)
无方法参数不写,无返回值可不写
2.setAccessible(boolean)设置为true,破坏封装,允许暴力访问(私有的成员变量赋值和取值前必须开启暴力访问)
8.反射的作用
用来编写框架或者工具类
例如:有两个工具包commons-beanutils-1.9.3.jar 和commons-logging-1.2.jar,该工具包中有一个BeanUtils工具类,该类有一个静态方法populate(Object Bean,Map map),该方法可以将map集合中的数据按照key封装到一个javabean对象中。
可以利用反射计数实现BeanUtils工具类中populate方法的逻辑
流程:
1.获取Bean类的Class对象
2.获取map集合所有的key
3.变量key,根据获取的Field对象
4.将key对应的值value值设置给Field对象(注意权限)
代码演示
import java.lang.reflect.Field;
import java.util.Map;
import java.util.Set;
public class MyBeanUtils {
/**
* 作用;将map集合中的数据根据key封装到bean对象的对应的成员变量中
*
* @param bean 要封装数据的bean对象
* @param map 提供数据的map集合
*/
public static void populate(Object bean, Map<String, Object> map) throws Exception {
//1 获取Class对象(反射第一步)
Class<?> beanClass = bean.getClass();
//2 获取map集合所有的key并遍历
Set<String> keySet = map.keySet();
keySet.forEach(s -> {
try {
//3 根据key获取对应成员变量对象(Field对象)(反射第二步)
Field field = beanClass.getDeclaredField(s);
//开启访问权限
field.setAccessible(true);
//4 给成员变量赋值(反射第三步)
field.set(bean,map.get(s));
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
});
}
}
浙公网安备 33010602011771号