代理模式之动态代理★★★★★

动态代理(不太好理解)

动态代理和静态角色一样,动态代理底层是反射机制

动态代理类是动态生成的,不是我们直接写好的!

动态代理(两大类):基于接口,基于类

  • 基于接口:JDK的动态代理【使用ing】
  • 基于类:cglib
  • java字节码实现:javasisit

了解两个类
1、Proxy:代理
2、InvocationHandler:调用处理程序

Proxy类

1、动态代理实例

1.接口 Host.java

//接口
public interface Host {
	public void rent();
}

2.接口Host实现类 HostMaster.java

//接口实现类
public class HostMaster implements Host{	
	public void rent() {
		System.out.println("房东要租房子");
	}
}

3.代理角色的处理程序类 ProxyInvocationHandler.java

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

///用这个类,自动生成代理
public class ProxyInvocationHandler implements InvocationHandler {

    // Foo f =(Foo) Proxy.NewProxyInstance(Foo. Class.GetClassLoader(),
    // new Class<?>[] { Foo.Class },
    // handler);

    //被代理的接口
    public Host host;

    public void setHost(Host host) {
        this.host = host;
    }

    //得到生成的代理类 
    public Object getProxy() {
        // newProxyInstance() -> 生成代理对象,就不用再写具体的代理类了
        // this.getClass().getClassLoader() -> 找到加载类的位置
        // hostMaster.getClass().getInterfaces() -> 代理的具体接口
        // this -> 代表了接口InvocationHandler的实现类ProxyInvocationHandler
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), host.getClass().getInterfaces(), this);


        //处理代理实例并返回结果
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object result = method.invoke(hostMaster, args);
            seeHouse();
            // 动态代理的本质,就是使用反射机制实现的
            // invoke()执行它真正要执行的方法
            fee();
            return result;
        }

        public void seeHouse() {
            System.out.println("看房子");
        }

        public void fee() {
            System.out.println("收中介费");
        }
    }

4.用户类 My2.java

import pojo2.Host;
import pojo2.Host2;
import pojo2.HostMaster;
import pojo2.ProxyInvocationHandler;

public class My2 {

	public static void main(String[] args) {
        
		//代理角色,现在没有;用代理角色的处理程序来实现Host接口的调用
		ProxyInvocationHandler pih = new ProxyInvocationHandler();
        
        //真实角色
		HostMaster hostMaster = new HostMaster();
        
        //pih -> HostMaster接口类 -> Host接口
		pih.setHost(hostMaster);
        
		//获取newProxyInstance动态生成代理类
		Host proxy = (Host) pih.getProxy();
		
		proxy.rent();

	}
}

5.改为万能代理类

///用这个类,自动生代理
public class ProxyInvocationHandler implements InvocationHandler {

    // 被代理的接口
    public Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    // 得到生成的代理类 -> 固定的代码
    public Object getProxy() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    // 处理代理实例并返回结果
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 动态代理的本质,就是使用反射机制实现的
        // invoke()执行它真正要执行的方法
        Object result = method.invoke(target, args);
        return result;
    }
}

posted @   无关风月7707  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
点击右上角即可分享
微信分享提示