Java动态代理--JDK实现

java动态代理JDK实现

步骤

定义接口

public interface Hello {

    void sayHi();
}

目标类(实现上面的接口)

public class HelloImpl implements Hello{

    public void sayHi() {
        System.out.println("睡你麻痹起来嗨");
    }
}

实际处理类

实现InvocationHandler接口

public class DynamicProxy implements InvocationHandler {

    private Object target;

    public DynamicProxy(Object target){
        this.target=target;

    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object result=method.invoke(target,args);
        after();
        return result;
    }

    public void before(){
        System.out.println("不想起床");
    }

    public void after(){
        System.out.println("就算起来了也嗨不起来");
    }
    }

JDK的Proxy类创建代理类

 public static void main(String[] args){
        Hello hello=new HelloImpl();

        DynamicProxy dynamicProxy=new DynamicProxy(hello);
        Hello helloProxy=(Hello) Proxy.newProxyInstance(hello.getClass().getClassLoader(),hello.getClass().getInterfaces(),dynamicProxy);

        helloProxy.sayHi();
    }

优化

可以看到Proxy动态代理创建过程中需要的参数:hello,dynamicProxy在DynamicProxy类中都有,可以做如下简化。

DynamicProxy

    public  T getProxy(){
        return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

优点

如果一个接口有多个实现类,对这些实现类创建代理类只需要这一个DynamicProxy就好了,不需要做其他的修改。如果需要在方法的前后做不同的事情,只用定义不同的DynamicProxy,里面的before和after方法完成相应的功能就好了。就算接口发生了变化,代理类也不用变化。

缺点

如果要代理没有实现任何接口的类就不行了。

你可能感兴趣的:(Java动态代理--JDK实现)