1.思维导图
2.代码部分
反射操作构造器:
1 Class<?> clazz = Class.forName("com.reflex.bean.User");
2 Constructor<?> c1 = clazz.getConstructor();
3 Object obj1 = c1.newInstance();
4 System.out.println(obj1);
1 Class<?> clazz = Class.forName("com.reflex.bean.User");
2 Constructor<?> c3 = clazz.getDeclaredConstructor(String.class, String.class);
3 c3.setAccessible(true);
4 Object obj3 = c3.newInstance("张三", "20000101");
5 System.out.println(obj3);
反射操作成员变量:
1 Class<User> clazz = User.class;
2 User user = clazz.newInstance();
3 Field idField = clazz.getField("id");
4 //设置成员变量
5 idField.set(user,250);
6 System.out.println(user);
7 //获取成员变量
8 Object idValue = idField.get(user);
9 System.out.println(idValue);
1 Class<User> clazz = User.class;
2 User user = clazz.newInstance();
3 Field usernameField = clazz.getDeclaredField("username");
4 //暴力反射
5 usernameField.setAccessible(true);
6 //设置成员变量
7 usernameField.set(user,"李四");
8 //获取成员变量
9 Object usernameValue = usernameField.get(user);
10 System.out.println(usernameValue);
反射操作成员方法:
1 Class<User> clazz = User.class;
2 User user = clazz.newInstance();
3 //获取public修饰的成员方法
4 Method method01 = clazz.getMethod("setPassword", String.class);
5 //使用方法对象
6 //obj:哪个对象在执行该方法
7 //args:方法执行时所需的参数值
8 method01.invoke(user,"123456");
1 Method method02 = clazz.getDeclaredMethod("show");
2 method02.setAccessible(true);
3 Object result = method02.invoke(user);
4 System.out.println(result);
反射越过泛型检查:
1 List<Integer> list = new ArrayList<Integer>();
2 list.add(1);
3 list.add(2);
4 list.add(3);
5 System.out.println(list);
6 //反射操作List的add方法
7 Class<? extends List> clazz = list.getClass();
8 Method add = clazz.getDeclaredMethod("add", Object.class);
9 add.setAccessible(true);
10 Object result = add.invoke(list, "hello , generic type !");
11 System.out.println(list);
反射通用方法案例:
1 public static void setValue(Object obj , String fieldName , Object value) throws Exception {
2 Class<?> clazz = obj.getClass();
3 //根据属性名称获取对应的set方法名称
4 String methodName = "set" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
5 Field field = clazz.getDeclaredField(fieldName);
6 //获取字段的数据类型
7 Class<?> fieldType = field.getType();
8 //获取到set方法对象
9 Method method = clazz.getMethod(methodName, fieldType);
10 //执行set方法
11 method.invoke(obj , value);
12 }
反射结合配置文件:
1 Properties properties = new Properties();
2 //将bean.properties中的数据存储到inputStream中
3 InputStream inputStream = Demo11.class.getClassLoader().getResourceAsStream("bean.properties");
4 //将bean.properties中的数据绑定到了Properties中!
5 properties.load(inputStream);
6 //获取全类名
7 String className = properties.getProperty("bean01");
8 //根据上述全类名创建了一个对象!
9 Object obj = Class.forName(className).newInstance();
10 System.out.println(obj);
11 //根据上述全类名创建了一个对象!
12 String className2 = properties.getProperty("bean02");
13 Object obj2 = Class.forName(className2).newInstance();
14 System.out.println(obj2);
静态代理设计模式:
1 //1、自定义一个代理类(增强类)实现和被代理类(被增强类)相同的接口
2 public class UserDaoImplProxy implements UserDao{
3
4 //2、在代理类中声明被代理类的引用
5 private UserDao userDao ;
6 public UserDaoImplProxy(){
7 userDao = new UserDaoImpl();
8 }
9 @Override
10 public void addUser() {
11 //3、在代理类的方法中使用被代理类调用方法
12 System.out.println("权限校验");
13 userDao.addUser();
14 System.out.println("日志记录");
15 }
16
17 @Override
18 public void deleteUser() {
19 userDao.deleteUser();
20 }
21 @Override
22 public void updateUser() {
23 userDao.updateUser();
24 }
25 @Override
26 public void selectUser() {
27 userDao.selectUser();
28 }
29 }