• java中的动态代理


    一、类中实现了接口,使用java.lang.reflect.Proxy类,创建一个代理工厂,可以动态代理类中方法。

    说明:被代理的类需要有实现的接口。

    例子:

    1 实体类代码

    实体类代码
    public class UserDao implements IUserDao{
        
        public UserDao() {
            // TODO Auto-generated constructor stub
        }    
    
        public void saveUser() {
            System.out.println("保存用户成功,saveUser()");
            
        }
    
    }
    
    public interface IUserDao {
        void saveUser(User user);
    }

    2 代理工厂方法

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    
    public class ProxyFactory {
        private Object target;
        
        public ProxyFactory(Object target) {
            this.target = target;
        }
        
        public Object getProxyInstance(){
            return Proxy.newProxyInstance(
                    target.getClass().getClassLoader(), 
                    target.getClass().getInterfaces(), 
                    new InvocationHandler() {
                        
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args)
                                throws Throwable {
                            System.out.println("方法之前执行");
                            
                            Object result = method.invoke(target, args);
                            
                            System.out.println("方法之后执行");
                            
                            return result;
                        }
                    });
        }
    
    }

    3 简单测试

    public void fun1(){
            User user = new User();
            user.setUname("good");
            IUserDao proxyInstance = (IUserDao) new ProxyFactory(userDao).getProxyInstance();
            proxyInstance.saveUser(user);
        }

    二、cglib代理,是子类代理。需要引用jar包,其中spring-core包已经包含了cglib的一些功能。主要接口:MethodInterceptor,主要类:Enhancer

    主要是没有实现接口的类代理。

    简单例子如下:

    1 实体类

    public class UserDao{    
        public UserDao() {
            // TODO Auto-generated constructor stub
        }
        public void saveUser() {
            System.out.println("保存用户成功,saveUser()");        
        }
    }

    2 cglib代理

    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    
    
    public class cglibFactory implements MethodInterceptor{
        private Object target;
        
        public cglibFactory(Object target) {
            this.target = target;
        }
        
        public Object getProxyInstance(){
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(target.getClass());
            enhancer.setCallback(this);
            return enhancer.create();
        }
    
        @Override
        public Object intercept(Object arg0, Method arg1, Object[] arg2,
                MethodProxy arg3) throws Throwable {
            System.out.println("代理方法前");
            Object result = arg1.invoke(target, arg2);
            
            System.out.println("代理方法后");
            return result;
        }    
    
    }

    3 简单测试

    public void fun1(){
            UserDao userDaoProxy = (UserDao) new cglibFactory(userDao).getProxyInstance();
            userDaoProxy.saveUser();
            
        }
  • 相关阅读:
    Linux搭建ldap前的准备工作
    samba配置文件帮助以及selinux配置
    rpcbind服务引起的nfs链接报错
    Linux中的inode
    hdu3974 Assign the task线段树 dfs序
    HDU1540线段树维护连续子区间
    2020牛客NOIP赛前集训营-提高组(第一场)C 牛牛的最大兴趣组
    Golang字符串是否存在于切片或数组中的小工具(基本等同于python in语法)
    快速修改MySQL数据库名称
    CPU利用率高,如何排查?
  • 原文地址:https://www.cnblogs.com/zhaopengcheng/p/6791936.html
Copyright © 2020-2023  润新知