Java高级特性之一动态代理

动态代理

什么是代理?

拦截真实业务对象访问,通过返回代理对象去操作!

什么是动态?

在运行时去动态处理真实业务对象的访问

代理对象的职责

1.与真实业务对象具备一样的行为!

比较:卖手机,手机厂商生产手机,它可以自己卖,也可以找一个代理人去帮自己卖!

不论是手机厂商还是代理商都有一样的行为:卖手机

2.代理对象本身没有真实业务对象的行为,只是间接的去访问真实对象的行为(方法)

动态代理是面向接口的,不是面向类的!

 

注意:

1.代理对象执行方法会调用Invocation invoke方法

2.代理对象执行方法 需要准备 三个参数

3.当代理对象调用final修改的方法时不会调用invoke方法

动态代理实例

1.真实业务

public interface HelloService {
    String sayHello(String name);
}
2.真实业务实现

public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String name) {
        System.out.println("hello "+name);
        return "helloworld";
    }
}

3.代理工厂类

public class HelloProxy {

    //根据真实helloService对象获得一个代理对象
    public static HelloService getProxy(final HelloService helloService) {
        //返回一个真实对象的代理对象
        /**
         * ClassLoader loader, 真实对象的类加载器
         Class[] interfaces, 真实对象的接口
         InvocationHandler h  代理响应器
         */
        //如何获取类加载器
        ClassLoader classLoader = helloService.getClass().getClassLoader();
        //如何获取真实对象的接口
        Class[] interfaces = helloService.getClass().getInterfaces();
        Object proxy = Proxy.newProxyInstance(classLoader, interfaces,
                new InvocationHandler() {
                    /**
                     * 匿名内部类
                     * 对于真实业务对象访问,都将执行以下invoke方法
                     * @param proxy 代理对象
                     * @param method 执行的真实业务对象的方法
                     * @param args  执行的真实业务对象方法的参数
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("执行了invoke...");
                        System.out.println("执行了"+method.getName());

                        Object res = method.invoke(helloService, args);
                        return res;
                    }
                });
        return (HelloService) proxy;
    }
}
4.使用代理类调用方法
public class HelloServiceDemo {
    public static void main(String[] args) {
        //真实业务对象
        HelloService helloService = new HelloServiceImpl();
        //通过代理程序获取真实业务的代理对象
        HelloService helloProxy = HelloProxy.getProxy(helloService);
        //用代理对象访问方法
        String result = helloProxy.sayHello("jack");
        System.out.println(result);
    }
}
运行结果

Java高级特性之一动态代理_第1张图片

主要关注动态代理类的创建方式!!!

你可能感兴趣的:(java特性)