Java代理实例解析
程序员文章站
2022-06-10 16:34:14
...
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!