liyifan687的博客

成功人士从不撸代码

Java静/动代理实例解析

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!
阅读更多
个人分类: java
想对作者说点什么? 我来说一句

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

不良信息举报

Java静/动代理实例解析

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭