动态代理

今天看了一下关于动态代理的东西,于是记录一下关于动态代理的东西。

Java的动态代理:

  代理模式是Java常用的一种设计模式,下面我通过举例来描述一下动态代理。

  动态代理的相关类和方法:InvocationHandler类:public Object invoke(Object proxy, Method method, Object[] args)

  Proxy.public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

  假设接口A用方法run(),接口A的实现类B也有run()方法。而动态代理是给类B找了一个兄弟,他会冒充B类(伪B),并且实现A接口,来替B完成任务。

  动态代理的原理是在InvocationHandler让用户自己添加要实现的逻辑:在invoke()方法中自己定义要增加的逻辑(相当于spring中的增强),在Proxy的newProxyInstance()中

传入InvocationHandler的实现,在这里Proxy重新编译代码,将增加的逻辑编译到代码中,下面一个通过动态原理生成的代理对象的java代码:

import java.lang.reflect.Method;
public class $Proxy1 implements UserMgr{
    public $Proxy1(InvocationHandler h) {
        this.h = h;
    }
    InvocationHandler h;
@Override
public void addUser() {
    try {
    Method md = UserMgr.class.getMethod("addUser");
    h.invoke(this, md);
    }catch(Exception e) {e.printStackTrace();}
}}

  用jdk自带的Proxy类进行动态代理,需要被代理的类实现一个接口。

public interface Moveable {
    void run();
}
public class Car implements Moveable{

    @Override
    public void run() {
        System.out.println("车在跑。。。。");
    }
}
package cn.edu.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class RunProxy implements InvocationHandler {

    private Object target;

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        Object result = null;
        System.out.println("Begining.....");
        result = method.invoke(target,args);
        System.out.println("Stopping....");
        return result;
    }

    public Object bind(Object target) {
        this.target=target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), this);
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        Car car = new Car();
        RunProxy runProxy = new RunProxy();
        Moveable proxy=(Moveable) runProxy.bind(car);
        proxy.run();
    }
}

运算结果:

Begining.....
车在跑。。。。
Stopping....

 

posted @ 2015-11-03 12:41  googlemeoften  阅读(252)  评论(0编辑  收藏  举报