zoukankan      html  css  js  c++  java
  • java动态代理Proxy

    package com.gz_06;
    
    public interface StudentDao {
        public void login();
        public void regist();
    }
    package com.gz_06;
    
    public class StudentDaoImpl implements StudentDao{
    
        @Override
        public void login() {
            System.out.println("登陆");
        }
    
        @Override
        public void regist() {
            System.out.println("注册");
        }
    
    }
    package com.gz_06;
    
    public class StudentDaoImpl2 implements StudentDao{
    
        @Override
        public void login() {
            System.out.println("权限验证");
            System.out.println("登陆");
            System.out.println("动态代理");
        }
    
        @Override
        public void regist() {
            System.out.println("权限验证");
            System.out.println("注册");
            System.out.println("动态代理");
        }
    
    }
    package com.gz_06;
    
    public interface UserDao {
        public void add();
        public void delete();
        public void change();
        public void find();
    }
    package com.gz_06;
    
    public class UserDaoImpl implements UserDao{
    
        @Override
        public void add() {
            System.out.println("增加操作");
        }
    
        @Override
        public void delete() {
            System.out.println("删除操作");
        }
    
        @Override
        public void change() {
            System.out.println("修改操作");
        }
    
        @Override
        public void find() {
            System.out.println("查询操作");
        }
    
    }
    package com.gz_06;
    
    public class UserDaoImpl2 implements UserDao{
    
        @Override
        public void add() {
            System.out.println("权限校验");
            System.out.println("增加操作");
            System.out.println("日志记录");
        }
    
        @Override
        public void delete() {
            System.out.println("权限校验");
            System.out.println("删除操作");
            System.out.println("日志记录");
        }
    
        @Override
        public void change() {
            System.out.println("权限校验");
            System.out.println("修改操作");
            System.out.println("日志记录");
        }
    
        @Override
        public void find() {
            System.out.println("权限校验");
            System.out.println("查询操作");
            System.out.println("日志记录");
        }
    
    }
    package com.gz_06;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;
    
    public class Test {
        public static void main(String[] args) {
            UserDao ud=new UserDaoImpl();
            ud.add();
            ud.delete();
            ud.change();
            ud.find();
            System.out.println("----------");
            //但是在实际开发中,一般在进行操作的时候都需要进行权限验证,操作后需要进行日志记录,怎么办呢?
            //因为是一部分人需要权限校验,和日志记录,所以第一种方式是重写一个实现类
            UserDao ud2=new UserDaoImpl2();
            ud2.add();
            ud2.delete();
            ud2.change();
            ud2.find();
            System.out.println("--------");
            //其他的类也需要权限校验,又这样做?
            StudentDao stu=new StudentDaoImpl();
            stu.login();
            stu.regist();
            System.out.println("-----");
            StudentDao stu2=new StudentDaoImpl2();
            stu2.login();
            stu2.regist();
            System.out.println("------");
            //这样做太恶心了,所以我们要学会偷懒,就需要使用动态代理
    /*        static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
            InvocationHandler 是代理实例的调用处理程序 实现的接口。 
             Object invoke(Object proxy, Method method, Object[] args)     在代理实例上处理方法调用并返回结果。 
    */
            InvocationHandler handler=new MyInvocationHandler(ud);
            UserDao proxy=(UserDao) Proxy.newProxyInstance(ud.getClass().getClassLoader(), ud.getClass().getInterfaces(), handler);
            proxy.add();
            proxy.delete();
            proxy.change();
            proxy.find();
            
            System.out.println("------");
            InvocationHandler handler2=new MyInvocationHandler(stu);
            StudentDao proxy2= (StudentDao) Proxy.newProxyInstance(stu.getClass().getClassLoader(), stu.getClass().getInterfaces(), handler2);
            proxy2.login();
            proxy2.regist();
            
        }
    }
    
    package com.gz_06;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class MyInvocationHandler implements InvocationHandler {
        private Object target;//目标代理对象
        public MyInvocationHandler(Object target){
            this.target=target;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
                System.out.println("权限校验");
                Object result=method.invoke(target, args);
                System.out.println("日志记录");
            return result;
        }
    
    
    }
    View Code
  • 相关阅读:
    B-tree/B+tree/B*tree
    java拆装箱(转)
    C语言身份证信息查询系统(修改版)
    UC编程:字符读取与行读取
    UC编程:通过fwrite()和write()比较标准库函数和系统调用的速度
    UC编程:输入输出重定向(系统调用)
    UC编程:输入输出重定向(标准IO)
    UC编程:环境变量的查询与修改
    Perl基础(1)chop与chomp的区别
    假期“实习”20天生存实录
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5608418.html
Copyright © 2011-2022 走看看