静态代理:直接上代码


package net.battier.dao;/*** 定义一个账户接口* * @author Administrator* */public interface Count {// 查看账户方法public void queryCount();// 修改账户方法public void updateCount();}

package net.battier.dao.impl;
import net.battier.dao.Count;/*** 委托类(包含业务逻辑)* * @author Administrator* */public class CountImpl implements Count {@Overridepublic void queryCount() {System.out.println("查看账户方法...");}@Overridepublic void updateCount() {System.out.println("修改账户方法...");}}

代理类:


CountProxy.java
package net.battier.dao.impl;
import net.battier.dao.Count; /*** 这是一个代理类(增强CountImpl实现类)* * @author Administrator* */public class CountProxy implements Count {private CountImpl countImpl;/*** 覆盖默认构造器* * @param countImpl*/public CountProxy(CountImpl countImpl) {this.countImpl = countImpl;}@Overridepublic void queryCount() {System.out.println("事务处理之前");// 调用委托类的方法;countImpl.queryCount();System.out.println("事务处理之后");}@Overridepublic void updateCount() {System.out.println("事务处理之前");// 调用委托类的方法;countImpl.updateCount();System.out.println("事务处理之后");}}

客户端:


/*** 客户*/publicclass Client {/*** @param args*/publicstaticvoid main(String[] args) {Subject subject = new RealSubject();Proxy proxy = new Proxy(subject);proxy.operate();}}

动态代理:

public  interface Subject {abstract  public  void request();}

// 具体角色RealSubject:public  class RealSubject implements Subject {public RealSubject() {}public  void request() {System.out.println( " From real subject. " );}}

代理处理器(ProxyHandler):


import java.lang.reflect.Method;import java.lang.reflect.InvocationHandler;public  class DynamicSubject implements InvocationHandler {private Object sub;public DynamicSubject() {}public DynamicSubject(Object obj) {sub = obj;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println( " before calling "  + method);method.invoke(sub,args);System.out.println( " after calling "  + method);return  null ;}}

客户端:


// 客户端:import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Client {static public void main(String[] args) throws Throwable {RealSubject rs = new RealSubject(); // 在这里指定被代理类InvocationHandler ds = new DynamicSubject(rs);Class cls = rs.getClass();// 以下是一次性生成代理Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(),ds );subject.request();}}

CGLib 简介:

JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

业务类:


package net.battier.dao;public interface BookFacade {public void addBook();}

实现类:


package net.battier.dao.impl;/*** 这个是没有实现接口的实现类* * @author student* */public class BookFacadeImpl1 {public void addBook() {System.out.println("增加图书的普通方法...");}}

代理:


package net.battier.proxy;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;/*** 使用cglib动态代理* * @author student* */public class BookFacadeCglib implements MethodInterceptor {private Object target;/*** 创建代理对象* * @param target* @return*/public Object getInstance(Object target) {this.target = target;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(this.target.getClass());// 回调方法enhancer.setCallback(this);// 创建代理对象return enhancer.create();}@Override// 回调方法public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {System.out.println("事物开始");proxy.invokeSuper(obj, args);System.out.println("事物结束");return null;}}

客户端:


package net.battier.test;import net.battier.dao.impl.BookFacadeImpl1;import net.battier.proxy.BookFacadeCglib;public class TestCglib {public static void main(String[] args) {BookFacadeCglib cglib=new BookFacadeCglib();BookFacadeImpl1 bookCglib=(BookFacadeImpl1)cglib.getInstance(new BookFacadeImpl1());bookCglib.addBook();}}

转载地址:https://blog.csdn.net/hintcnuie/article/details/10954631#

Java代理模式学习相关推荐

  1. java代理模式学习笔记

    代理模式:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理类和被代理类必须实现同一个接口 ...

  2. 设计模式学习之代理模式学习(一)

    设计模式学习之代理模式学习(一) 关于设计模式想必学习过Java语言的人都知道吧,当时对其进行深入学习的的人应该不是很多.在我看来设计方面的知识相比于框架应用配置等知识要有意思的多,并且设计模式的对一 ...

  3. java代理模式实现

    java代理模式实现 @(代理模式)[静态代理,动态代理,InvocationHandler] java的代理模式 分为两种,静态代理和动态代理,学习下什么是代理和静态动态代理的作用. java代理模 ...

  4. java代理模式_Java代理

    java代理模式 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它将指导您 ...

  5. java代理模式(java代理模式和适配器模式)

    Java设计模式的中介者模式是怎样的? 如果对象之间的关系原本一目了然,中介对象的加入便是"画蛇添足". 来看下中介者模式的组成部分吧. 1) 抽象中介者(Mediator)角色: ...

  6. java代理模式总结

    Java代理模式根据代理类生成时间的不同,可以分为静态代理和动态代理,它如同中介机构,可以为目标类提供代理服务,以控制对对象的访问,目标类的任何方法在执行前都必须经过代理类,这样代理类就可以用来负责请 ...

  7. [Java] 代理模式 Proxy Mode

    [Java] 代理模式 Proxy Mode 文章目录 [Java] 代理模式 Proxy Mode 1. 代理思想 2.java.lang.reflect.Proxy类 2.1 利用反射创建prox ...

  8. 浅谈自己对Java代理模式的理解--即为什么要用怎么用

    首先,国际惯例,上Java代理模式的定义:  Java代理模式:对其他对象提供一种代理以控制对这个对象的访问.              定义很简单,就一句话,怎么去理解,不急,先听一个小故事: 故事 ...

  9. 阿里十年资深程序员吐血总结之Java代理模式

    阿里十年资深程序员吐血总结之Java代理模式 文章目录 阿里十年资深程序员吐血总结之Java代理模式 1.接口代理 2.类代理 3.动态代理都是通过反射实现的吗 4.jdk动态代理和cglib动态代理 ...

最新文章

  1. GCC 在 Linux、Windows 系统安装
  2. TVM cmake示例展示
  3. CSS列表和一些变化情况
  4. 深入浅出让你理解什么是LLVM
  5. 怎样更好地使用快捷键?
  6. mysql注入绕过单引号_SQL注入-绕过过滤规则
  7. 用Java代码实现日志记录器_如何在此简单的Java日志记录实现中附加到日志文件? - java...
  8. iOS开发——高级技术本地化与国际化详解
  9. 中转换成list集合_Java集合、数组与泛型中的几个陷阱,你掉进了几个?
  10. k8s资源对象及API群组
  11. 软件测试视频教程下载:APP测试类型和方法
  12. 基于DHT网络的BT磁力链蜘蛛源码
  13. SAP PS 后台配置
  14. 行梯形矩阵最简行阶梯矩阵
  15. SpringBoot系列
  16. Vue如何使用ECharts
  17. amixer alsa
  18. 设计模式(10)——外观模式
  19. mysql的decimal类型与Java的BigDecimal
  20. html简单个人网页制作 出行网站设计——凤阳旅游(6页) HTML5期末考核大作业,网站——旅行网站

热门文章

  1. 刷题总结——road(ssoi)
  2. 【转】TYVJ 1695 计算系数(NOIP2011 TG DAY2 1)
  3. ajax 获取JSON
  4. Android4.0升级新特性
  5. python怎么切图片_Python切割图片成九宫格
  6. webbrowser 访问iframe拒绝访问_Win10系统下Documents and Settings系统文件夹拒绝访问解决方法...
  7. linux系统如何创建python文件_Linux搭建python环境详解
  8. c 语言中 十六进制数表达,c – 如何解释像0x0A这样的十六进制数?
  9. mysql更新索引不影响业务_mysql 索引是否能提高UPDATE,DELETE,INSERT 处理速度
  10. recyclerview添加间隔左右_卤水保养、卤水添加小常识,你是否已经掌握