Java第十一周心得体会

1.本周思维导图

Java第十一周心得体会_第1张图片 点击查看详情

2.个人总结

反射:

  • 反射越过泛型检查
List list = new ArrayList();
    list.add(1);
    list.add(2);
    list.add(3);
    System.out.println(list);
    //反射操作List的add方法
    Class clazz = list.getClass();
    Method add = clazz.getDeclaredMethod("add", Object.class);
    add.setAccessible(true);
    Object result = add.invoke(list, "hello , generic type !");
    System.out.println(list);
  • 反射通用方法案例
public static void setValue(Object obj , String fieldName , Object value) throws Exception {
        Class clazz = obj.getClass();
        //根据属性名称获取对应的set方法名称
        String methodName = "set" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
        Field field = clazz.getDeclaredField(fieldName);
        //获取字段的数据类型
        Class fieldType = field.getType();
        //获取到set方法对象
        Method method = clazz.getMethod(methodName, fieldType);
        //执行set方法
        method.invoke(obj , value);
}
  • 反射结合配置文件
Properties properties = new Properties();
//将bean.properties中的数据存储到inputStream中
InputStream inputStream = Demo11.class.getClassLoader().getResourceAsStream("bean.properties");
//将bean.properties中的数据绑定到了Properties中!
properties.load(inputStream);
//获取全类名
String className = properties.getProperty("bean01");
//根据上述全类名创建了一个对象!
Object obj = Class.forName(className).newInstance();
System.out.println(obj);
//根据上述全类名创建了一个对象!
String className2 = properties.getProperty("bean02");
Object obj2 = Class.forName(className2).newInstance();
System.out.println(obj2);

 

设计模式:

  • 静态代理设计模式
//1、自定义一个代理类(增强类)实现和被代理类(被增强类)相同的接口
public class UserDaoImplProxy implements UserDao{

    //2、在代理类中声明被代理类的引用
    private UserDao userDao ;
    public UserDaoImplProxy(){
        userDao = new UserDaoImpl();
    }
    @Override
    public void addUser() {
    //3、在代理类的方法中使用被代理类调用方法
        System.out.println("权限校验");
        userDao.addUser();
        System.out.println("日志记录");
    }

    @Override
    public void deleteUser() {
        userDao.deleteUser();
    }
    @Override
    public void updateUser() {
        userDao.updateUser();
    }
    @Override
    public void selectUser() {
        userDao.selectUser();
    }
}
  • 装饰者设计模式
//1、定义装饰类(增强类)实现和被装饰类(被增强类)相同的接口
public class UserDaoWrapper implements UserDao {

//2、在装饰类中声明被装饰类的引用
    private UserDao userDao ;

    public UserDaoWrapper(){
    }
    public UserDaoWrapper(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void addUser() {
        System.out.println("权限校验");
        userDao.addUser();
        System.out.println("日志记录");
    }

    @Override
    public void deleteUser() {
        userDao.deleteUser();
    }

    @Override
    public void updateUser() {
        userDao.updateUser();
    }

    @Override
    public void selectUser() {
      
       userDao.selectUser();
    }
}
  • 动态代理
UserDao userDao = new UserDaoImpl();
        UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(
                userDao.getClass().getClassLoader(),
                userDao.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //获取到接口中方法对象 , 比如 : UserDao接口中addUser方法
                        //之前
                        //先获取实现子类的Class对象
                        //再获取到接口的Class对象
                        //再获取到接口中的方法对象
                        //现在
                        //再获取到接口的Class对象  -- userDao.getClass().getInterfaces(),
                        //再获取到接口中的方法对象  --  Method method
                        //method : 就是接口中的方法对象
                        Object returnValue = null;
                        if (null != method) {
                            boolean present = method.isAnnotationPresent(SystemLog.class);
                            if (present) {
                                //如果有@SystemLog注解 , 执行原有功能 ,  打印日志
                                returnValue = method.invoke(userDao, args);
                                String currentTimeStr = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss")
                                        .format(new Date());
                                SystemLog systemLog = method.getAnnotation(SystemLog.class);
                                String className = systemLog.className();
                                String methodName = systemLog.methodName();
                                System.out.println(currentTimeStr + " --- " + className + "类中 ---" + methodName + "()方法 --- 运行了");
                            } else {
                                //如果没有@SystemLog注解, 执行原有功能, 不打印日志
                                returnValue = method.invoke(userDao, args);
                            }
                        }

                        return returnValue;
                    }
                });

        userDaoProxy.addUser();

自定义连接池:

public class MyDataSource {

    int initPoolSize = 3;
    LinkedList connections = new LinkedList<>();

    public MyDataSource(){
        createConnections();
    }

    public void createConnections(){
        for (int i = 1 ; i <= initPoolSize ; i++) {
            try {
                Connection connection = JDBCUtils.getConnection();
                connections.add(connection);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 取出连接
     * @return
     */
    public Connection getConnection(){
        //连接池中的连接够用
        if (connections.size() == 0 || connections.isEmpty()) {
            //连接池中的连接不够用 , 新建一些连接存储连接池中
            createConnections();
        }
        Connection connection = connections.remove(0);//普通连接对象
        //根据普通连接对象 获取 一个连接代理对象(增强连接对象)
        Connection connectionProxy = (Connection) Proxy.newProxyInstance(
                connection.getClass().getClassLoader(),
                connection.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //处理增强close方法
                        String methodName = method.getName();
                        Object returnValue = null;
                        if ("close".equals(methodName)) {
                            //如果是close方法,归还连接
                            returnValue = connections.add(connection);
                        } else {
                            //如果不是close方法,就执行原有功能
                            returnValue = method.invoke(connection, args);
                        }
                        return returnValue;
                    }
                });
        return connectionProxy;
    }
}

request操作请求参数:

//获取指定参数值
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("username : " + username + " , password : " + password);
        System.out.println("---------------");
        //获取所有请求参数名称
        Enumeration parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String parameterName = parameterNames.nextElement();
            String parameterValue = request.getParameter(parameterName);
            System.out.println("name : " + parameterName + " , value : " + parameterValue);
        }
        System.out.println("---------------");
        //获取指定请求参数所有值
        String[] usernames = request.getParameterValues("username");
        System.out.println(usernames[0]);
        String[] hobbys = request.getParameterValues("hobbys");
        for (String hobby : hobbys) {
            System.out.println(hobby);
        }
        System.out.println("---------------");
        //获取请求参数对应的map :Map(String,String[])
        //键:请求参数名称  相当于 getParameterNames
        //值:一组请求参数值 相当于 getParameterValues
        Map parameterMap = request.getParameterMap();
        Set> entrySet = parameterMap.entrySet();
        for (Map.Entry entry : entrySet) {
            //键 - 请求参数名称
            String parameterName = entry.getKey();
            //值 - 一组请求参数值
            String[] values = entry.getValue();
            StringBuffer valueStr = new StringBuffer();
            for (String value : values) {
                valueStr.append(value + " ");
            }
            System.out.println("参数名称 : "+ parameterName + " , 参数值 : " + valueStr);
        }

 

你可能感兴趣的:(Java第十一周心得体会)