栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

静态代理,动态代理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

静态代理,动态代理

设计模式
代理设计模式
1.静态代理模式
2.动态代理设计模式

代理的作用:
1.功能增强
2.访问控制:通过代理,控制是否可以调用‘目标对象的方法’。

被代理者:目标类,在目标类执行的前后做处理

静态
简介:
1.代理类是手工创建的
2.代理的目标类是确定的
代理类持有被代理类的对象,实现和被代理类相同的接口,并增加相应的业务逻辑,以达到代理的效果。

代码:

interface IService {
    public void doService(String name);
}


class Waiter implements IService {
    @Override
    public void doService(String name) {
        System.out.println("当前waiter服务客户:" + name);
    }
}


class ProxyWaiter implements IService {

    //定义一个目标类对象
    private Waiter waiter;

    //注入
    public void setWaiter(Waiter waiter) {
        this.waiter = waiter;
    }

    @Override
    public void doService(String name) {
        System.out.println("欢迎光临!");
        this.waiter.doService(name);
        System.out.println("欢迎下次光临!");
    }
}

public class MainTest {
    public static void main(String[] args) {
        Waiter waiter = new Waiter();
        ProxyWaiter proxy = new ProxyWaiter();
        proxy.setWaiter(waiter);

        proxy.doService("张三");
        System.out.println("--------------");
        waiter.doService("张三");
    }
}

动态:
目标类和代理类之间不是写死的
两种方式

简介:
目标类和代理类之间是动态配置的,动态配置的本质是通过反射机制实现的。

写法一:jdk动态代理实现
invoke 在工程中翻译为“调用”
代码:

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

interface IService {
    public void doService(String name);
}


class Waiter implements IService {
    @Override
    public void doService(String name) {
        System.out.println("当前waiter服务客户:" + name);
    }
}


class MyInvokeHandler implements InvocationHandler {
    private Waiter waiter;

    public void setWaiter(Waiter waiter) {
        this.waiter = waiter;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("欢迎光临!");
        //通过反射调用目标类的方法
        method.invoke(waiter,args);
        System.out.println("欢迎下次光临!");
        return null;
    }
}

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

        //创建目标类对象
        Waiter waiter=new Waiter();

        //创建处理类对象
        MyInvokeHandler myInvokeHandler = new MyInvokeHandler();
        myInvokeHandler.setWaiter(waiter);

        //创建代理对象
        IService proxy = (IService) Proxy.newProxyInstance(waiter.getClass().getClassLoader(), new Class[]{IService.class}, myInvokeHandler);

        proxy.doService("张三");

    }
}

写法二:
cglib动态代理
情形:目标类没有接口

简介:
cglib动态代理能够针对没有接口的类,实现动态代理。
代码比jdk动态代理简单

底层会生成目标类的子类,而目标类作为父类

首先导包
asm-3.3.1.jar
cglib-2.2.2.jar
若使用idea,则大可不必

代码:

package com.springboot.demo.hhh;

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

import java.lang.reflect.Method;


class Waiter {
    public void doService(String name) {
        System.out.println("当前waiter服务客户:" + name);
    }
}


class MyMethodInterceptor implements MethodInterceptor {

    @Override
    public Object intercept(Object target, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable {
        System.out.println("欢迎光临!");
        //调用目标类的方法,而目标类是父类
        methodProxy.invokeSuper(target, arg);
        System.out.println("欢迎下次光临!");
        return null;
    }
}

public class Test {
    public static void main(String[] args) {
        //创建目标类对象
        Waiter waiter = new Waiter();
        //创建方法拦截器对象
        MyMethodInterceptor interceptor = new MyMethodInterceptor();

        //创建Enhancer对象
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Waiter.class);
        enhancer.setCallback(interceptor);

        //生成代理类对象
        Waiter proxyWaiter = (Waiter) enhancer.create();

        proxyWaiter.doService("张三");
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/309516.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号