动态代理的两种实现

InvocationHandler

动态产生一个实现相应接口的代理类

package Proxy;

public class ThirdChannelPayment implements Payment {
    public void pay() {
        System.out.println("缴费");
    }
    public void pay2() {
        System.out.println("缴费2");
    }
}
package Proxy;

public interface Payment {
    void pay();
    void pay2();
}
package Proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//实现InvocationHandler 接口 中的invoke
public class DynamicProxy implements InvocationHandler {

    private Object target;

    public Object bind(Object target){

        this.target = target;
        //getClassLoader():取得该Class对象的类装载器
        //getInterfaces()获得这个对象所实现的接口。
        //生成一个实现目标接口的代理类
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),this);
    }


    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;
    }
}
package Proxy;

public class Demo {
    public static void main(String[] args) {


        Payment payment = new ThirdChannelPayment();
        DynamicProxy proxy = new DynamicProxy();
        Payment newProx =(Payment)proxy.bind(payment);
        newProx.pay2();
        payment.pay2();
    }
}

cglib

 

生成一个类的子类做为代理类,调用父类的方法

package cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibDynamicProxy implements MethodInterceptor {

    private Object target;

    public Object getInstance(Object target){
        this.target = target;
        Enhancer enhancer = new Enhancer();//加强器
        //创建父类的子类
        enhancer.setSuperclass(this.target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("前");
        Object result = methodProxy.invokeSuper(o,objects);
        System.out.println("后");
        return result;
    }
}
package cglib;

import Proxy.DynamicProxy;
import Proxy.Payment;
import Proxy.ThirdChannelPayment;

public class Demo {
    public static void main(String[] args) {


        ThirdChannelPayment payment = new ThirdChannelPayment();
        CglibDynamicProxy cglibDynamicProxy = new CglibDynamicProxy();
        ThirdChannelPayment tcp = (ThirdChannelPayment) cglibDynamicProxy.getInstance(payment);
        tcp.pay2();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值