首页 > 其他分享 >代理模式 Proxy

代理模式 Proxy

时间:2023-04-01 15:33:58浏览次数:36  
标签:Object 代理 模式 class proxy println public Proxy

代理类模式

在不改变原有类的基础上,代理一个类,并对其方法前后进行增强

1.Java动态代理:代理实现某一个接口的类或接口本身

接口类

public interface Body {
    void doThing();
}

实现类:

public class Person implements Body{
    @Override
    public void doThing() {
        System.out.println("大人做事情");
    }
}

代理类:

public class JdkProxyPerson {
    public static Object getBean(Object target) {
        return Proxy.newProxyInstance(JdkProxyPerson.class.getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("jdk proxy start----");
                Object invoke = method.invoke(target, args);
                System.out.println("jdk proxy end----");
                return invoke;
            }
        });
    }
}

测试类:

public class TestProxy {
    public static void main(String[] args) {
        Person person = (Person)BeanFactory.getBean("person");
        Body bean = (Body) JdkProxyPerson.getBean(person);
        bean.doThing();
    }
}

jdk proxy start----
孩子在玩耍
大人做事情
jdk proxy end----

2.Cglib动态代理:代理基础类 填补Jdk代理的缺憾

依赖:

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.2.7</version>
</dependency>

基础类:

public class Child {
    public void play(){
        System.out.println("孩子在玩耍");
    }
}

代理类:

public class CglibProxyPerson {
    public static Object createProxy(Class<?> clazz, Callback callback) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(callback);
        return enhancer.create();
    }

    /**
     * 拦截器
     */
    public static class MyInterceptor implements MethodInterceptor {
        public MyInterceptor() {
        }

        @Override
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            System.out.println("cglib start...");
            Object result = proxy.invokeSuper(obj, args);
            System.out.println("cglib end...");
            return result;
        }
    }
}

测试类:

public class TestProxy {
    public static void main(String[] args) {
        Child proxy = (Child)CglibProxyPerson.createProxy(Child.class, new CglibProxyPerson.MyInterceptor());
        proxy.play();
    }
}

cglib start...
孩子在玩耍
cglib end...

标签:Object,代理,模式,class,proxy,println,public,Proxy
From: https://www.cnblogs.com/csh-java/p/17278695.html

相关文章

  • 导致代理IP频繁掉线的常见原因分析
    以下是导致代理IP频繁掉线的一些常见原因:代理IP质量不佳:低质量的代理IP可能会频繁掉线,因为它们可能被许多用户同时使用,或者它们的速度和稳定性可能不足以支持您的应用程序或任务。网络不稳定:代理IP本身可能是稳定的,但如果您的网络连接不稳定,则代理IP可能会频繁掉线。这可能是由于网......
  • 企业实践 | 如何在阿里云裸金属服务器上使用UEFI模式实践安装国产银河麒麟V10操作系统
    [点击......
  • 解释器模式(Interpreter Pattern)
    一、概念解释器模式(InterpreterPattern)用于构造一个简单的语言解释器,将字符串按照自定义的方式解释执行,是一种不常用的设计模式除非从事底层开发自己需要去定义较为复杂的表达式,否则基本上不同这个设计模式二、适用场景(1)当一个语言需要解释执行,并可以将该语言中的句子......
  • Haproxy
    Haproxy负责均衡的作用Web服务器的动态水平扩展--->对用户无感知增加业务并发访问及处理能力--->解决单服务器瓶颈问题节约公网IP地址--->降低IT支持成本隐藏内部服务器IP--->提高内部服务器安全性配置简单--->固定格式的配置文件功能丰富--->支持四层和七层,支持动态下线......
  • 命令模式
    概述《设计模式》一书中对于“命令模式”的意图描述如下:将一个请求封装成为一个对象,从而可以使用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作一般“命令模式”的UML图如下所示:一般会在以下几种情况下使用命令模式:需要抽象出待执行的......
  • 装饰设计模式-java
      packagecn.shuishandt.opp;publicclassDecorateTest2{publicstaticvoidmain(String[]args){ Coffecoffe=newCoffe(); System.out.println(coffe.cost()+"=============>"+coffe.info()); Milkmilk=newMilk(coffe);......
  • 跨境电商店铺如何防关联封号?需要socks5代理?
    跨境电商店铺防止关联封号的最佳方法是确保在不同的设备、IP地址、浏览器、操作系统和支付账户之间切换。这样做可以减少平台将多个账户视为同一人的风险,从而防止因关联而被封号。以下是一些可行的措施:1.使用不同的设备:尽可能在不同的设备上登录不同的店铺账户,例如使用不同的电脑或......
  • Mapper代理开发
    Mapper代理开发步骤1.定义与SQL映射文件同名的Mapper接口。并且将Mapper接口和SQL映射文件放置在同一目录下,一般配置文件放在resources文件夹下,可以在resources里面定义一个与java放置Mapper接口同路径的文件夹,在用maven编译后两个文件就会在同一个目录下。  2.设置SQL映射......
  • Redhat/CentOS Linux 系统进入单用户模式
    Redhat/CentOSLinux系统进入单用户模式以CentOS7.9和Redhat8.2为例进行操作,因为CentOS是Redhat的发行版,所以同版本号界面和操作是一样的。CentOS7.9 开机在grub引导界面时,按下e键进入编辑模式: 找到linux16这一行,在行末添加rd.break(注意这里是一整行),使用Ct......
  • 项目一众筹网07_01_SpringSecurity框架简介和用法、SpringSecurity负责的是 权限验证
    项目一众筹网07_01_SpringSecurity文章目录项目一众筹网07_01_SpringSecurity01简介SpringSecurity负责的是权限验证02-SpringSecurity简介03-Spring的注解模式maven引入Spring环境04-准备测试环境05-加入SpringSecurity环境06-实验1-放行首页和静态资源(下一篇)01简介现在主流的权......