zoukankan      html  css  js  c++  java
  • 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();
            
        }
  • 相关阅读:
    HTML DOM 12 表格排序
    HTML DOM 10 常用场景
    HTML DOM 10 插入节点
    HTML DOM 09 替换节点
    HTML DOM 08 删除节点
    HTML DOM 07 创建节点
    022 注释
    024 数字类型
    005 基于面向对象设计一个简单的游戏
    021 花式赋值
  • 原文地址:https://www.cnblogs.com/zhaopengcheng/p/6791936.html
Copyright © 2011-2022 走看看