java动态代理Proxy
2016-06-22 20:29
645 查看
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
相关文章推荐
- 解决eclipse中Adb connection Error:远程主机强迫关闭了一个现有的连接 的问题
- spring全注解项目
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- Java线程池
- 第二章 Spring MVC入门 —— 跟开涛学SpringMVC
- Spring bean 生命周期
- java开发环境搭建
- JAVA中实例变量和类变量
- 【每天学一点】JAVA session相关+JSP语句
- spring boot 获取端口和 Ip
- 【Java 高并发】并发下的ArrayList&&HashMap
- Java...和泛型
- Java IO流的操作规律
- Struts 2再曝远程代码执行漏洞S2-037
- Java字符流与字节流转换
- MVC设计模式和JavaWeb三层模型
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
- Java IO流学习总结
- java乱码问题
- java sleep与wait区别