zoukankan      html  css  js  c++  java
  • Java中两个动态代理

    Java实现动态代理的两种方式

    Java领域中,常用的动态代理实现方式有两种,一种是利用JDK反射机制生成代理,另外一种是使用CGLIB代理。

    JDK代理必须要提供接口,而CGLIB则不需要,可以直接代理类。下面分别举例说明。

    1.JDK动态代理:

    public interface People {
        public void sayHello();
    }
    复制代码
    复制代码
    public class Chinese implements People {
    
        @Override
        public void sayHello() {
            System.out.println("Chinese say hello.");
        }
    }
    复制代码
    复制代码
    复制代码
    复制代码
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class PeopleInvocationHandler implements InvocationHandler{
        
        private Object peolple;
        
        Intermediary(Object people){
            this.people = people;
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {

    Object invoke = method.invoke(people, args);
            System.out.println("-------- end ---------");
            return invoke;
        }
    }
    复制代码
    复制代码
    复制代码
    复制代码
    import java.lang.reflect.Proxy;
    
    public class Test {
        public static void main(String[] args) {
            People chinese = new People();
            PeopleInvocationHandler invocationHandler = new PeopleInvocationHandler(chinese);
            People proxy = (People) Proxy.newProxyInstance(chinese.getClass().getClassLoader(), chinese.getClass().getInterfaces(), invocationHandler);
            proxy.sayHello();
        }
    }
    复制代码
    复制代码

    2.CGLIB动态代理

    需要引入CGLIB相关Jar包

    public class Chinese {
        public void sayHello(){
            System.out.println("Chinese say hello");
        }
    }
    复制代码
    复制代码
    import java.lang.reflect.Method;
    
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    public class ChinesePoxy implements MethodInterceptor {
    
        @Override
        public Object intercept(Object object, Method method, Object[] args,MethodProxy methodProxy) throws Throwable {
            Object intercept = methodProxy.invokeSuper(object, args);
         System.out.println("-------- end ---------");
        return intercept; 
      }
    }
    复制代码
    复制代码
    复制代码
    复制代码
    import net.sf.cglib.proxy.Enhancer;
    
    public class Test {
        public static void main(String[] args) {
            ChineseProxy chineseProxy = new ChineseProxy();
            
            Enhancer enhancer = new Enhancer();  
            enhancer.setSuperclass(Chinese.class);
            enhancer.setCallback(chineseProxy);
            
            Chinese proxy = (Chinese) enhancer.create();
            proxy.sayHello();
        }
    }

    转自:https://www.cnblogs.com/xifengxiaoma/p/9377261.html
  • 相关阅读:
    单据体内2个字段比较
    立账模式
    余额
    单据服务校验设置
    值更新事件(触发带基础属性到指定字段)
    重建索引 ,压缩数据库
    数据库自动备份
    BZOJ 4597: [Shoi2016]随机序列 线段树 + 思维
    BZOJ 4399: 魔法少女LJJ 线段树合并 + 对数
    BZOJ 2217: [Poi2011]Lollipop 构造 + 思维
  • 原文地址:https://www.cnblogs.com/bcl88/p/12433171.html
Copyright © 2011-2022 走看看