欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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!