动态(静态)代理实例解析

1.代理模式

  • 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.
  • 这样做可在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.
  • 这里使用到的一个思想:不要随意去修改别人已写好的代码或方法,如需修改,可通过代理方式来扩展

例如想邀请一位明星,并不是直接联系明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只负责活动中的节目,其他琐碎的事就交给他的代理人(经纪人)来解决.

2.静态代理

  • 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类.

假如有个码农,开发个app,客户有天直接找到他说加个功能。码农心想我不要面子的啊,你去找项目经理(代理)和他谈。

首先先来个接口类
public interface ICoder {
	public void impldemand(String functionname);
}
再来个真实码农对象
public class JavaCoder implements ICoder {
		private String name;
		public JavaCoder(String name){
			this.name=name;
		}
	@Override
	public void impldemand(String functionname) {
		// TODO Auto-generated method stub
		System.out.println(name + " implemented demand:" + functionname + " in JAVA!");
	}

}
代理对象(经理)
public class CoderProxy implements ICoder {
	private ICoder coder;
	public CoderProxy(ICoder coder){
		this.coder=coder;
	}
	@Override
	public void impldemand(String functionname) {
		// TODO Auto-generated method stub
		System.out.print("项目经理:");
		coder.impldemand(functionname);
	}

}
最后实现下
public class test {
	public static void main(String args[]){
		ICoder coder=new JavaCoder("xx码农");		
		ICoder proxy=new CoderProxy(coder);
		proxy.impldemand("add function1");
		}
	}
实现效果如:
经理:xx码农 implemented function:add function1 in JAVA!

这样就完成了经理去告诉码农完成什么任务,不需要客户直接与码农交流,也就保住了码农的面子,码农专心撸码。

但是

  • 虽静态代理可在不修改目标对象的功能前提下,对目标功能扩展.

代理类的源代码是由程序员编写的,在程序运行前它的.class文件就已经存在了,固称为静态代理类。

  • 可因代理对象需与目标对象实现一样的接口,会有很多代理类。一旦接口增加方法,目标对象与代理对象都要维护.代码会冗余。码农和经理都觉得很烦,什么事都要沟通一下再处理。
  • 于是动态代理

动态代理

动态代理类的字节码在程序运行时由Java反射机制动态生成,无需码农手工编写它的源代码。动态代理类不仅简化了编程工作,且提高了软件系统的可扩展性,因Java反射机制可生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler接口提供了生成动态代理类的能力。

动态代理类
public class CoderDynamicProxy implements InvocationHandler {
	private ICoder coder;
	 public CoderDynamicProxy(ICoder _coder){
	        this.coder = _coder;
	    }
	//调用被代理的方法
	    @Override
	    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
	        System.out.println("动态:");
	        Object result = method.invoke(coder, args);
	        
	        return result;
	    }
}
实现
public static void main(String args[]){
		ICoder coder=new JavaCoder("xx码农");
		
		//ICoder proxy=new CoderProxy(coder);
		//proxy.impldemand("add function1");
		
		//创建中介类实例
        InvocationHandler  handler = new CoderDynamicProxy(coder);
        //获取类加载器
        ClassLoader cl = coder.getClass().getClassLoader();
        //动态产生一个代理类
        ICoder proxy = (ICoder) Proxy.newProxyInstance(cl, coder.getClass().getInterfaces(), handler);
        //通过代理类,执行doSomething方法;
        proxy.impldemand("add function2");
	}
结果如下
动态
xx码农 implemented function:add function2 in JAVA!

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭