静态、动态代理模式

目录

1、静态代理

2、jdk动态代理和cglib动态代理的区别

3、jdk动态代理

4、cglib动态代理


1、静态代理

UserProxy类:

public class UserProxy implements UserService{
private UserService userService=new UserServiceImpl();
    @Override
    public void dance() {
        System.out.println("安排场地");
        System.out.println("时间:");
        userService.dance();
        System.out.println("结束");
    }
}

UserService类:

public class UserServiceImpl implements UserService{
    @Override
    public void dance() {
        System.out.println("边唱歌边跳舞");
    }
}

UserProxyImpl类:

public class UserServiceImpl implements UserService{
    @Override
    public void dance() {
        System.out.println("边唱歌边跳舞");
    }
}

测试:

public class Test1 {
    public static void main(String[] args) {
        //测试静态代理
        UserService userService=new UserProxy();
        userService.dance();
    }
}

2、jdk动态代理和cglib动态代理的区别

1、CGLIB代理和JDK代理都是Java中的动态代理技术。

2、JDK代理只能对实现了接口的类生成代理对象,而CGLIB代理可以对实现了接口的类以及没有实现接口的类生成代理对象。 JDK代理是通过反射实现的,因此生成代理对象的速度比CGLIB代理要慢一些。

3、CGLIB代理则是通过生成被代理类的子类来实现的,因此生成代理对象的速度比JDK代理要快,但是由于需要生成子类,因此在实际应用中对内存的消耗会比JDK代理要大一些。

4、JDK代理只能代理实现了接口的类,而且生成的代理对象的类型是接口类型。而CGLIB代理可以代理没有实现接口的类,生成的代理对象的类型是被代理类的子类。 

3、jdk动态代理

UserService类:

public interface UserService {
    void dance();
}

UserServiceImpl类:

public class UserServiceImpl implements UserService{
    @Override
    public void dance() {
        System.out.println("边唱歌边跳舞");
    }
}

Test:

public class Test2 {
    //动态代理
    public static void main(String[] args) {
//        Object target=new Object();
        UserServiceImpl target=new UserServiceImpl();
        //动态生成一个代理对象
        UserService proxy1= (UserService) 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("扩充的功能111");
                        //调用目标方法
                        Object result=method.invoke(target,args);
                        System.out.println("扩充的功能222");
                        return result;
                    }
                }
        );
        proxy1.dance();
    }
}

4、cglib动态代理

CglibProxy类:

public class CglibProxy {
    private Object target;

    public CglibProxy(Object target) {
        this.target = target;
    }
    public Object getProxy(){
        Enhancer enhancer=new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//                System.out.println(o);
//                System.out.println(method);
//                System.out.println(objects);
//                System.out.println(methodProxy);
//                System.out.println("测试");
                System.out.println("扩充新功能...");
//                调用目标方法并返回结果
                Object result= methodProxy.invoke(target,objects);
                return result;
            }
        });
        return enhancer.create();
    }
}

StudentService类:

public class StudentService {
    public String study(String content){
        System.out.println("学习"+content);
        return "好";
    }
}

Test类:

public class Test6 {
    public static void main(String[] args) {
        StudentService service=new StudentService();
        StudentService proxy= (StudentService) new CglibProxy(service).getProxy();
        String result= proxy.study("代理模式");
        System.out.println(result);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值