【Java】Java代理

发布于:2025-02-11 ⋅ 阅读:(29) ⋅ 点赞:(0)

目录

1. 引入

2. 代理

2.1  代理的目的:

2.2 代理的两种模式

1. 静态代理

$$1  定义:

 $$2 组成

$$3 实现步骤:

$$4  IDEA实现:

2. 动态代理

$$1  定义:

$$2  组成

 $$3  实现步骤:

 $$4  IDEA实现:


1. 引入

访问不到的东西交给别人去访问。

转账:

A--->B转账

这样一来,核心资源冗余。

在代理类中做风险隔离

2. 代理

2.1  代理的目的

        1.功能增强

                在不修改真实对象的情况下增加额外功能。比如权限验证、事务管理等。

                可以实现延迟加载,缓存优化等策略提升系统性能和资源利用率。

        2.控制访问

                限制对真实对象的直接访问,确保只有合适的用户或操作能够调用真实对象的方法,增强系统的安全性和可靠性,降低客户端和实际服务对象的耦合度。

2.2 代理的两种模式

CGLIB核心是继承,只有动态代理--->Mybatis

JDK核心是接口,有静态代理,也有动态代理

1. 静态代理

静态代理核心

        目标类,就有目标对象

代理

        由代理类控制着对目标对象的生成。

$$1  定义

        静态代理是一种设计模式,通过创建一个代理类来实现对目标对象的代理。代理类和目标类实现相同的接口,通过代理类来间接调用目标类的方法,从而实现功能的扩展。

 $$2 组成
  • 接口(Interface):定义了代理类和目标类需要实现的方法。
  • 目标类(Target Class):实现了接口的具体业务类。
  • 代理类(Proxy Class):实现了接口,并在内部持有目标类的实例,通过调用目标类的方法来实现代理功能。
$$3 实现步骤:
  • 定义接口。
  • 实现目标类。
  • 创建代理类。
  • 使用代理类。
$$4  IDEA实现

 定义接口:

public interface ZZ {
    public void zz(String A,String B,Double money);
}

实现目标类:

public class ZFB implements ZZ{

    @Override
    public void zz(String A, String B, Double money) {
        System.out.println("用户"+A+"给用户"+B+"转了"+money+"元");
    }
}

创建代理类:

public class APP implements ZZ{
    private ZFB zfb=new ZFB();
    @Override
    public void zz(String A, String B, Double money) {
        System.out.println("风险隔离");
        zfb.zz(A,B,money);
    }
}

使用代理类:

APP app=new APP();
        app.zz("张三","李四",100.0);

内存图:


2. 动态代理

静态代理易实现。

使用多态

$$1  定义:

        动态代理是在运行时动态生成代理类的实现。动态代理不需要事先知道目标类的具体实现,而是通过反射机制在运行时动态生成代理类。

$$2  组成
  • 动态代理类:在运行时动态生成,实现了被代理接口,并将方法调用转发给实际的被代理对象。
  • InvocationHandler接口:动态代理的核心接口,定义了代理类需要实现的方法,用于在代理对象的方法被调用时执行一些额外的逻辑。
 $$3  实现步骤:
  • 定义需要代理的接口。
  • 实现InvocationHandler接口,在invoke方法中实现对目标方法的增强或修改。
  • 使用Proxy类的newProxyInstance方法动态创建代理对象。
  • 调用代理对象的方法。
 $$4  IDEA实现

照着上面的,仿照写一个WX转账的。

1.代理目标类

多态

父类的引用指向子类的对象。

Object

2.实现接口,通过接口去实现核心方法

通过反射。

public class DTAPP implements InvocationHandler {
    private Object object=new Object();

    public DTAPP(Object o){
        this.object=o;
    }

    public Object getProxyInstance(){
        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("功能的增强");
        method.invoke(object,args);
        return null;
    }
}

 

DTAPP app1=new DTAPP(new ZFB());
        DTAPP app2=new DTAPP(new WX());
        ZZ zfb=(ZZ)app1.getProxyInstance();
        zfb.zz("张三","李四",100.0);
        WZ wx=(WZ)app2.getProxyInstance();
        wx.WXZZ("王五","李梅",89.9);

 


网站公告

今日签到

点亮在社区的每一天
去签到