Java代理模式学习
静态代理:直接上代码
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代理模式学习相关推荐
- java代理模式学习笔记
代理模式:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理类和被代理类必须实现同一个接口 ...
- 设计模式学习之代理模式学习(一)
设计模式学习之代理模式学习(一) 关于设计模式想必学习过Java语言的人都知道吧,当时对其进行深入学习的的人应该不是很多.在我看来设计方面的知识相比于框架应用配置等知识要有意思的多,并且设计模式的对一 ...
- java代理模式实现
java代理模式实现 @(代理模式)[静态代理,动态代理,InvocationHandler] java的代理模式 分为两种,静态代理和动态代理,学习下什么是代理和静态动态代理的作用. java代理模 ...
- java代理模式_Java代理
java代理模式 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它将指导您 ...
- java代理模式(java代理模式和适配器模式)
Java设计模式的中介者模式是怎样的? 如果对象之间的关系原本一目了然,中介对象的加入便是"画蛇添足". 来看下中介者模式的组成部分吧. 1) 抽象中介者(Mediator)角色: ...
- java代理模式总结
Java代理模式根据代理类生成时间的不同,可以分为静态代理和动态代理,它如同中介机构,可以为目标类提供代理服务,以控制对对象的访问,目标类的任何方法在执行前都必须经过代理类,这样代理类就可以用来负责请 ...
- [Java] 代理模式 Proxy Mode
[Java] 代理模式 Proxy Mode 文章目录 [Java] 代理模式 Proxy Mode 1. 代理思想 2.java.lang.reflect.Proxy类 2.1 利用反射创建prox ...
- 浅谈自己对Java代理模式的理解--即为什么要用怎么用
首先,国际惯例,上Java代理模式的定义: Java代理模式:对其他对象提供一种代理以控制对这个对象的访问. 定义很简单,就一句话,怎么去理解,不急,先听一个小故事: 故事 ...
- 阿里十年资深程序员吐血总结之Java代理模式
阿里十年资深程序员吐血总结之Java代理模式 文章目录 阿里十年资深程序员吐血总结之Java代理模式 1.接口代理 2.类代理 3.动态代理都是通过反射实现的吗 4.jdk动态代理和cglib动态代理 ...
最新文章
- GCC 在 Linux、Windows 系统安装
- TVM cmake示例展示
- CSS列表和一些变化情况
- 深入浅出让你理解什么是LLVM
- 怎样更好地使用快捷键?
- mysql注入绕过单引号_SQL注入-绕过过滤规则
- 用Java代码实现日志记录器_如何在此简单的Java日志记录实现中附加到日志文件? - java...
- iOS开发——高级技术本地化与国际化详解
- 中转换成list集合_Java集合、数组与泛型中的几个陷阱,你掉进了几个?
- k8s资源对象及API群组
- 软件测试视频教程下载:APP测试类型和方法
- 基于DHT网络的BT磁力链蜘蛛源码
- SAP PS 后台配置
- 行梯形矩阵最简行阶梯矩阵
- SpringBoot系列
- Vue如何使用ECharts
- amixer alsa
- 设计模式(10)——外观模式
- mysql的decimal类型与Java的BigDecimal
- html简单个人网页制作 出行网站设计——凤阳旅游(6页) HTML5期末考核大作业,网站——旅行网站
热门文章
- 刷题总结——road(ssoi)
- 【转】TYVJ 1695 计算系数(NOIP2011 TG DAY2 1)
- ajax 获取JSON
- Android4.0升级新特性
- python怎么切图片_Python切割图片成九宫格
- webbrowser 访问iframe拒绝访问_Win10系统下Documents and Settings系统文件夹拒绝访问解决方法...
- linux系统如何创建python文件_Linux搭建python环境详解
- c 语言中 十六进制数表达,c – 如何解释像0x0A这样的十六进制数?
- mysql更新索引不影响业务_mysql 索引是否能提高UPDATE,DELETE,INSERT 处理速度
- recyclerview添加间隔左右_卤水保养、卤水添加小常识,你是否已经掌握