jdk动态代理模式

寵の児 提交于 2021-01-27 17:27:05

原理

  • 在程序的执行过程中,使用jdk的反射机制,创建代理类对象,并动态的指定要代理目标类

作用

  • 访问控制,在代理中,控制是否可以调用目标对象的方法
  • 功能增强,可以完成在目标对象的调用是增加额外的功能
  • 可以随时给不同的目标创建代理类

实现步骤

1 创建接口,定义目标类要完成的功能
public interface HelloService {
    void sayHello();
}
2 创建目标类实现接口
public class HelloImpl implements HelloService {
    @Override
    public void sayHello() {
        System.out.println("Hello");
    }
}
3 创建InvocationHandler接口的实现类,在invoke方法中完成代理类的功能
public class MyInvokerHandler implements InvocationHandler {

    private Object target;

    /**
     * 传入目标对象,对其创建代理对象
     * @param target
     */
    public MyInvokerHandler(Object target) {
        this.target = target;
    }
    /**
     * invoke()代理类需要完成的功能
     *
     * @param proxy  jdk创建的代理对象,
     * @param method 目标类中的方法
     * @param args   目标类中方法的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //使用反射机制调用某个方法
        //Method 表示方法
        Object result = method.invoke(target, args);
        return result;
    }
}
4 使用Proxy类的静态方法,创建代理对象,并把返回值转为接口类型
public class InvokerHandlerTest {
    public static void main(String[] args) {
        HelloService helloService = new HelloImpl();
        MyInvokerHandler invokerHandler = new MyInvokerHandler(helloService);
        HelloService proxy = (HelloService) Proxy.newProxyInstance(helloService.getClass().getClassLoader(), helloService.getClass().getInterfaces(), invokerHandler);
        proxy.sayHello();
    }
}

test

Hello

Process finished with exit code 0

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!