java动态代理

代理:为其他对象提供代理,来控制对该对象的访问。起到客户端和目标对象之间的中介作用。(转:http://www.cnblogs.com/rollenholt/archive/2012/11/28/2792779.html

代理模式:主要涉及到三方面:抽象接口、代理类、被代理类。代理对象与被代理对象有同样的接口。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。(转:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

java动态代理机制,可采用如下方式使用,代码说明:

//抽象接口
public interface MyInterface {
    public void doSomething1();
    public void doSomething2();
    public void doSomething3(String s);
}
//被代理类,目标对象
public class MyImpl implements MyInterface {
    @Override
    public void doSomething1() {
        // TODO Auto-generated method stub
        System.out.println("doSomethings1");

    }
    @Override
    public void doSomething2() {
        // TODO Auto-generated method stub
        System.out.println("doSomethings2");
    }
    @Override
    public void doSomething3(String s) {
        // TODO Auto-generated method stub
        System.out.println("doSomething3 print:" + s);
    }
}
//InvocationHandler接口实现类,含有目标对象的引用,需要实现invoke方法
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyInvocationHandler implements InvocationHandler {
    //代理的实际对象引用
    private MyInterface obj;
    public MyInvocationHandler(){
        
    }
    public MyInvocationHandler(MyInterface obj){
        this.obj = obj;
    }

    @Override
    public Object invoke(Object arg0, Method arg1, Object[] arg2)
            throws Throwable {
        // TODO Auto-generated method stub
        /*int flag = 1;
        if(arg1.getName().equals("doSomething1"))
            flag = 1;
        else if(arg1.getName().equals("doSomething2"))
            flag = 2;
        else
            flag = 3;*/
        //预处理
        //System.out.println("start up doSomething" + flag);
        System.out.println("start up doSomething");
        //调用目标对象的方法
        arg1.invoke(obj, arg2);
        //结束处理
        System.out.println("clean up doSomething");
        //System.out.println("clean up doSomething" + flag);
        return null;
    }

}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;


public class test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //创建目标对象
        MyInterface obj = new MyImpl();
        //创建InvocationHandler对象
        InvocationHandler invoker = new MyInvocationHandler(obj);
        //创建代理对象,调用Proxy的newProxyInstance方法
        MyInterface proxy = (MyInterface)Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), invoker);
        //调用代理方法,实际上回调用目标对象的方法
        proxy.doSomething1();
        System.out.println();
        proxy.doSomething2();
        System.out.println();
        proxy.doSomething3("HelloWorld");
    }

}

动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。 但是,JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理。(转:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

一致对java动态代理搞不懂,这次稍微看了下,我的理解是,java动态代理是针对接口的,而一个接口可以被多个类实现,这样可以省去为每个实现类创建代理类,大大减少了重复代码的编写,不知道是不是这样?这一块理解还是很浅,先记录下,后面在看看。

内容主要参考了下面两篇博客,万分感谢!!

http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

http://www.cnblogs.com/rollenholt/archive/2012/11/28/2792779.html

posted on 2015-11-25 22:15  爱踢小菜  阅读(180)  评论(0编辑  收藏  举报

导航