java设计模式之jdk动态代理

145 阅读1分钟

jdk代理模式通过继承Invocationhandler接口来实现

创建一个接口

package cn.quangaoleng;

public interface HelloWorld {
    public void sayHello();
}

实现这个接口

package cn.quangaoleng;

public class HelloWorldImple implements  HelloWorld{
    @Override
    public void sayHello() {
        System.out.println("Hello World!");
    }
}

实现Invocation接口来写一个可以实现jdk动态代理的类

package cn.quangaoleng;

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

public class JdkProxyExample implements InvocationHandler{
   //真是对象
    private Object target = null;

    /**
     * 建立对象和真实对象之间的关系,并返回真实对象
     * @param target 真实对象
     * @return  返回代理对象
     */
    public Object bind(Object target){
        this.target= target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

    /**
     * 代理方法逻辑
     * @param proxy 代理对象
     * @param method 当前调度方法
     * @param args 方法执行参数
     * @return 返回执行结果
     * @throws Throwable 异常
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("进入方法逻辑");
        System.out.println("执行方法前");
        Object object = method.invoke(target,args);
        System.out.println("执行方法后");
        return object;
    }
}

进行测试

package cn.quangaoleng;

import org.junit.Test;

public class TestJdkProxy {

    @Test
    public void testJdkProxy(){
        JdkProxyExample example = new JdkProxyExample();
        HelloWorld h = (HelloWorld) example.bind(new HelloWorldImple());
        h.sayHello();
    }
}

我们通过 Object object =method.invoke(target,args);
这句可以看出其实实现功能的还是真实的对象,我们进行绑定时,方法返回一个代理对象,当用这个代理对象执行方法时,用于绑定真实对象的jdk动态代理类将执行invoke方法,将要执行的方法,方法参数,代理对象,真实对象作为参数,利用反射去执行真实对象的method