• java 动态代理


    动态代理一

    //---------------TargetInterface
    package cn.ms.proxy;
    
    public interface TargetInterface {
    
        public void method1();
        public String method2();
        public int method3(int x);
        
    }
    
    //---------------Target
    package cn.ms.proxy;
    
    public class Target implements TargetInterface {
    
        @Override
        public void method1() {
            System.out.println("method1 running...");
        }
    
        @Override
        public String method2() {
            System.out.println("method2 running...");
            return "method2";
        }
    
        @Override
        public int method3(int x) {
            System.out.println("method3 running...");
            return x;
        }
    
    }
    
    //---------------ProxyTest
    package cn.ms.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class ProxyTest {
    
        public static void main(String[] args) {
            Target target = new Target();
            TargetInterface newProxy = (TargetInterface) Proxy.newProxyInstance(
                    target.getClass().getClassLoader(), 
                    target.getClass().getInterfaces(),//---需要增强类的接口(1)
                    new InvocationHandler() {
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//----proxy默认要增强的对象也就是(1)中传入的接口
                            System.out.println("目标方法前逻辑");
                            Object invoke = method.invoke(target, args);
                            System.out.println("目标方法后逻辑");
                            return invoke;
                        }
                    });
            newProxy.method1();
            System.out.println("------------------ method1  end ------------------");
            String returnMethod2 = newProxy.method2();
            System.out.println(returnMethod2);
            System.out.println("------------------ method2  end ------------------");
            int returnMethod3 = newProxy.method3(7);
            System.out.println(returnMethod3);
            System.out.println("------------------ method3  end ------------------");
        }
        
    }

    动态代理二

    //----------UserService
    public interface UserService {
        void save();
        void delete();
        void update();
        void find();
    }
    
    //----------UserServiceImpl
    public class UserServiceImpl implements UserService {
        @Override
        public void save() {
            //开启事务
            System.out.println("保存用户");
            //关闭事务
        }
        @Override
        public void delete() {
            //开启事务
            System.out.println("删除用户");
            //关闭事务
        }
        @Override
        public void update() {
            //开启事务
            System.out.println("更新用户");
            //关闭事务
        }
        @Override
        public void find() {
            //开启事务
            System.out.println("查找用户");
            //关闭事务
        }
    }
    
    //----------UserServiceProxyFactory
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class UserServiceProxyFactory implements InvocationHandler {
        private UserService us;
        
        public UserServiceProxyFactory(UserService us){
            this.us = us;
        }
        
        public UserService getUserServiceProxy(){
            UserService usProxy = (UserService) Proxy.newProxyInstance(UserServiceProxyFactory.class.getClassLoader(),
                    us.getClass().getInterfaces(),
                    this);
            return usProxy;
        }
        
        @Override
        //--proxy当前的代理对象
        //--method代理对象的方法
        //--args方法的参数
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("打开事务");
            Object obj = method.invoke(us, args);//这个method中的第一个参数是方法所在的对象
            System.out.println("提交事务");
            return obj;
        }    
    }
    
    //----------UserServiceProxyTest
    import org.junit.Test;
    
    public class UserServiceProxyTest {
        
        @Test
        public void fun(){
            UserService us = new UserServiceImpl();
            UserServiceProxyFactory factory = new UserServiceProxyFactory(us);
            UserService usProxy = factory.getUserServiceProxy();
            usProxy.save();
        }
        
    }

    动态代理使用(处理全局乱码的问题)

    package com.ithiema.web.filter;
    
    import java.io.IOException;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    
    public class EncodingProxyFilter implements Filter {
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
                final HttpServletRequest httpServletRequest = (HttpServletRequest) request;
                HttpServletRequest enhanceRequest = (HttpServletRequest) Proxy.newProxyInstance(
                        httpServletRequest.getClass().getClassLoader(),
                        httpServletRequest.getClass().getInterfaces(),
                        new InvocationHandler() {
                            @Override
                            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                                if(method.getName().equals("getParameter")){
                                    String invoke = (String) method.invoke(httpServletRequest, args);
                                    invoke = new String(invoke.getBytes("iso-8859-1"), "UTF-8");
                                    return invoke;
                                }
                                return method.invoke(httpServletRequest, args);
                            }
                        });
                chain.doFilter(enhanceRequest, response);
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
        
        @Override
        public void destroy() {
    
        }
    
    }
  • 相关阅读:
    前端生成pdf文件之pdfmake.js
    vim 安装
    linux基础学习
    python 编码处理
    Ubuntu 下配置 SSH服务全过程及问题解决
    yum 安装
    Ubuntu安装MySQL
    Linux各发行版本及其软件包管理方法
    轻松学习LINUX系列教程推出
    常用命令
  • 原文地址:https://www.cnblogs.com/ms-grf/p/9029135.html
Copyright © 2020-2023  润新知