Day52 反射回顾

1.思维导图

2.代码部分

反射操作构造器:

  • 访问public修饰的构造器
1 Class<?> clazz = Class.forName("com.reflex.bean.User");
2 Constructor<?> c1 = clazz.getConstructor();
3 Object obj1 = c1.newInstance();
4 System.out.println(obj1);
  • 访问非public修饰的构造器
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);

反射操作成员变量:

  • 操作public修饰的成员变量
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);
  • 操作非public修饰的成员变量
 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);

反射操作成员方法:

  • 操作public修饰的成员方法
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");
  • 操作非public修饰的成员方法
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 }

反射结合配置文件:

  • 根据配置文件中的className生成对象
 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 }

猜你喜欢

转载自www.cnblogs.com/Her4c/p/12700922.html