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

 

posted @ 2016-06-22 20:29  guodaxia  阅读(246)  评论(0编辑  收藏  举报