反射

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();
}
});


}
}
posted on 2023-03-25 12:08  zl子路  阅读(32)  评论(0)    收藏  举报