Java高级特性之一动态代理

来源:互联网 发布:python string转list 编辑:程序博客网 时间:2024/06/07 06:27

动态代理

什么是代理?

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

什么是动态?

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

代理对象的职责

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);    }}
运行结果



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