动态代理常用的两种方式

基于接口的动态代理

public interface IActor {
    /**
     * 基本演出
     *
     * @param money
     */
    void basicActor(float money);

    /**
     * 危险演出
     *
     * @param money
     */
    void dangerActor(float money);
}
public class Actor implements IActor {
    @Override
    public void basicActor(float money) {
        System.out.println("BasicActor make money:" + money);
    }

    @Override
    public void dangerActor(float money) {
        System.out.println("DangerActor make money:" + money);
    }
}
public class ClientTest {
    public static void main(String[] args) {
        final Actor actor = new Actor();
        /**
         * 基于接口的动态代理,三个参数:
         * 1.ClassLoader:和被代理对象使用相同的类加载器。
         * 2.Interfaces:和被代理对象具有相同的行为,实现相同的接口。
         * 3.InvocationHandler:如何代理。执行被代理对象的任何方法,都会经过该方法。
         *      3.1 proxy:代理对象的引用。不一定每次都用得到
         *      3.2 method:当前执行的方法对象
         *      3.3 args:执行方法所需的参数
         *      3.4 上述方法的返回值就作为当前类中的invoke()的返回值。
         */
        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("Invoke...");
                System.out.println(proxy.getClass());

                System.out.println("----------Method1----------");
                // rtValue是我们方法的返回值,我们通过invoke返回一下
                Object rtValue = method.invoke(actor, args);
                System.out.println("----------Method2----------");
                return rtValue;
            }
        };
        IActor proxyInstance = (IActor) Proxy.newProxyInstance(actor.getClass().getClassLoader(),
                actor.getClass().getInterfaces(), handler);

        proxyInstance.basicActor(3000);

    }
}

基于子类的动态代理

public final class Actor {
    public void basicActor(float money) {
        System.out.println("BasicActor make money:" + money);
    }

    public void dangerActor(float money) {
        System.out.println("DangerActor make money:" + money);
    }
}
/**
 * @author NanShan @create
 * 2020-04-30 10:46
 *
 * 实现方法2:基于子类的动态代理
 *
 * 用CGLib的Enhancer类创建代理对象:
 * 1. 被代理对象不能是final的
 * 2. 需要用Enhancer.ceate方法
 *      Class:被代理对象的字节码
 *      Callback:如何代理, 这是一个接口;所以需要传入一个实现类对象。
 */
public class ClientTest2 {
    public static void main(String[] args) {
        final  Actor actor = new Actor();

        MethodInterceptor interceptor = new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("intercept...");

                System.out.println("----------Method1----------");
                Object rtValue = method.invoke(actor, objects);
                System.out.println("----------Method2----------");
                return rtValue;
            }
        };

        Actor proxyInstance= (Actor) Enhancer.create(actor.getClass(), interceptor);
        proxyInstance.basicActor(1000);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值