黑马程序员技术交流社区

标题: 【广州校区】+【原创】+ jdk动态代理 [打印本页]

作者: jianhong    时间: 2018-10-11 10:04
标题: 【广州校区】+【原创】+ jdk动态代理
JDK动态代理有以下特点:
1.代理对象,不需要实现接口
2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
3.动态代理也叫做:JDK代理,接口代理
4.动态代理要求目标对象一定要实现接口,所以也叫做接口代理!

接口:
/**
* 明星接口:定义规范,约定的作用。
*/
public interface IStar {
    /**
     * 唱歌
     */
    void singing(double money);

    /**
     * 拍戏
     */
    void play(double money);
}
实现:
/**
* 明星刘德华,是目标对象
*/
public class LiuDeHuaStar implements IStar {
    @Override
    public void singing(double money) {
        System.out.println("谢霆锋唱歌一级棒,收费标准:"+money);
    }

    @Override
    public void play(double money) {
        System.out.println("谢霆锋拍戏棒棒滴,收费标准:"+money);
    }
}
代理
public class App {
    public static void main(String[] args) {
        // 0.目标对象
        IStar target = new LiuDeHuaStar();
        // 1.对目标对象生成代理对象
        IStar proxy = (IStar) Proxy.newProxyInstance(
                //参数1:类加载器(默认)
                target.getClass().getClassLoader(),
                //参数2:目标对象实现的接口类型数组
                target.getClass().getInterfaces(),
                //参数3:事件处理程序(执行代理对象方法时候会触发这里)
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //获取方法参数
                        Double money = (Double) args[0];
                        // 判断
                        if(money > 100000){
                            // 执行目标对象方法
                            return method.invoke(target,args);
                        } else {
                            // 不执行目标对象方法,提示
                            System.out.println("档期忙,后期再合作!");
                            return null;
                        }
                    }
                }
        );
        System.out.println(proxy.getClass());
        // 2.调用代理对象的方法
        proxy.play(10);
    }
}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2