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; } }