Day13两种动态代理解析

1 动态代理技术

  • JDK条件:目标类有接口,是基于接口动态生成实现类的代理对象。

  • Cglib条件:目标类无接口且不能用final修饰,基于被代理对象动态生成子类代理对象

实现类

package proxy;

public class User {

    public void methodPublic1() {
        System.out.println("methodPublic1");
    }

    public void methodPublic2(String a) {
        System.out.println(a+"========methodPublic2");
    }

    public void defaultMethod1(int b) {
        System.out.println(b+"========defaultMethod1");
    }

    public void defaultMethod2() {
        System.out.println("defaultMethod2");
    }

}

拦截类

import java.lang.reflect.Method;

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

public class UserMethodInterceptor implements MethodInterceptor {

    @Override
    public Object intercept(Object obj, Method method, Object[] arg,
            MethodProxy proxy) throws Throwable {
        System.out.println("before:"+method.getName());
        Object object = proxy.invokeSuper(obj, arg);
        System.out.println("after:"+method.getName());
        return object;
    }

}

测试类

public class Testcglib {

    public static void main(String[] args) {
                //该设置用于输出cglib动态代理产生的类
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\cglibProxyClass");  
        Enhancer enhancer = new Enhancer();
        //继承被代理类
        enhancer.setSuperclass(User.class);
        //设置回调
        enhancer.setCallback(new UserMethodInterceptor());
        //生成代理类对象
        User user = (User)enhancer.create();
        //在调用代理类中方法时会被我们实现的方法拦截器进行拦截
        user.methodPublic1();
        user.methodPublic2("22222222");
        user.defaultMethod1(111);
        user.defaultMethod2();

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兜兜转转m

一毛钱助力博主实现愿望

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值