JAVA动态代理模式(从现实生活角度理解代码原理)

所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联。

java动态代理主要是使用java.lang.reflect包中的两个类。

InvocationHandler类

public Object invoke(Object obj,Method method,Object[] obs) 

其中第一个参数 obj 指的是代理类,method是被代理的方法,obs是指被代理的方法的参数组。此方法由代理类来实现。

Proxy类

protectedProxy(InvocationHandler h);

staticClass getProxyClass(ClassLoader loader,Class[] interfaces);

staticObject newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandlerh);

动态代理其实是在运行时生成class,所以,我们必须提供一组interface,然后告诉他class已经实现了这些interface,而且在生成Proxy的时候,必须给他提供一个handler,让他来接管实际的工作。

同样的在开始代码实现之前,我们还是要讲一下关于链家的故事,之前静态代理模式中提到链家(接口)有卖二手房的业务,公司有一大批售房精英(静态代理),但现在互联网金融这块发展势头迅猛,链家也想插一脚进去,但苦于没有相关人才(代理)储备,这时公司便有了从相关的人才市场(动态代理“工厂”)寻找专业人才实现此类业务的想法,人才市场,顾名思义,就是根据企业(接口)的某种需求(被代理的方法)寻找有相关技能人才的场所。下面开始动态代理的代码实现:

第一步:LianJia提供房屋买卖以及互联网贷款渠道方法(接口


interface LianJia {
	public void sellHouse();
	public void loan();
}


第二步:我们的房主不仅要卖房也要贷款做其他事情(市场需求)奋斗得知链家有这个业务所以他又找到了链家(被代理对象

public class HouseMaster implements LianJia {
	@Override
	public void sellHouse() {
		System.out.println("我有房子要卖");
	}
	@Override
	public void loan() {
		System.out.println("我要贷款做生意");
	}
}


第三步:这里是浩瀚的人才市场,你想要的这里都有(生成动态代理的类


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class CreatProxy implements InvocationHandler{
	//声明被代理对象(之所以用Object是因为他在Java中是所有类包含自定义类的超类)
	private Object target;
	//创建代理对象(根据被代理对象需求)
	public Object bind(Object target){
		this.target = target;
		//使用Proxy类创建一个动态代理对象
		Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
		return proxy;
	}
	//具体执行业务的方法
		/**
		 * proxy: 代理类对象
		 * method:被代理对象的方法
		 * args:被代理对象方法的参数
		 */
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		//调用业务方法
		method.invoke(target);
		return null;
	}
}

第四步:实现测试类


public class Test {
	public static void main(String[] args) {
		HouseMaster hm = new HouseMaster();
		CreatProxy cp = new CreatProxy();
		LianJia lj = (LianJia) cp.bind(hm);
		lj.sellHouse();
		lj.loan();
	}
}

我们也发现从静态代理到动态代理整个过程中发现,被代理对象(市场需求)会随时变化,企业(接口)也必须启用动态代理模式才可应对市场变化(个人认为富士康就属于一个大的电子类动态代理工厂,而苹果谷歌等企业则为市场需求的缔造者与规则(接口)的)。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值