动态代理 [用jdk实现]

2023-11-01

一. java 的jdk動態代理

     用JDK實現的動態代理,被代理的對象必須實現一個接口才可以.其實現主是通過java.lang.reflect.Proxy類和 java.lang.reflect.InvocationHandler接口;

 

二. 本章用'售票點代理車站售票'的示例來演示java 的jdk動態代理的實現.完整代碼如下:

 

1. [被代理目標要實現的接口]

package structuralPattern.proxy.jdk;
/**
 * @ClassName: ITarget 
 * @Description:賣票接口
 * @author Liyongbin
 * @date 2011-2-8 下午12:52:09 
 * @version V1.0
 */
public interface ITicket {
	public abstract void saleTicket();
}

 

2. 車站售票[被代理目標]

package structuralPattern.proxy.jdk;
/**
 * @ClassName: Train 
 * @Description:車站
 * @author Liyongbin
 * @date 2011-2-8 下午12:54:36 
 * @version V1.0
 */
public class Train implements ITicket{

	@Override
	public void saleTicket() {
		System.out.println("售車票");
	}
}

 

3. 售票服務

package structuralPattern.proxy.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * @ClassName: BuyTicketService 
 * @Description:售票服務
 * @author Liyongbin
 * @date 2011-2-8 下午01:02:36 
 * @version V1.0
 */
public class BuyTicketService implements InvocationHandler {
	//要代理的目標
	private Object target;
	
	public BuyTicketService(Object target) {
		this.target=target;
	}
	//
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		deliverTicket();
		method.invoke(target, args);
		discountTicket();
		return null;
	}
	//"代理"自己的方法1
	public void deliverTicket() {
		System.out.println("送票上門服務");
	}
	//"代理"自己的方法2
	public void discountTicket() {
		System.out.println("買票打折服務");
	}
}

 

4. 動態代理

package structuralPattern.proxy.jdk;

import java.lang.reflect.Proxy;

/**
 * @ClassName: DynamicProxy_JDK 
 * @Description: 動態代理
 * @author Liyongbin
 * @date 2011-2-8 下午12:58:45 
 * @version V1.0
 */
public class DynamicProxy_JDK {
	public Object getProxy(Object target) {
		return Proxy
				.newProxyInstance(target.getClass().getClassLoader(), target
				.getClass().getInterfaces(), new BuyTicketService(target));
	}
}

 

5. 測試

package structuralPattern.proxy.jdk;

public class DynamicProxyTest {
	public static void main(String[] args) {
		//實例化代理
		DynamicProxy_JDK dp = new DynamicProxy_JDK();
		//代理
		ITicket ticket = (ITicket) dp.getProxy(new Train());
		//調用目標方法
		ticket.saleTicket();
	}
}

 

6. 運行結果:

    送票上門服務
    售車票
    買票打折服務

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态代理 [用jdk实现] 的相关文章

  • Java的JConsole可以用来自动配置内存吗?

    我正在学习JavaJMX https docs oracle com javase tutorial jmx and JConsole http docs oracle com javase 7 docs technotes guides
  • 部署程序集:当前显示的页面包含无效值

    我从 Sourceforge 导入了一个 Java Web 应用程序 我花了三个工作周的时间来消除项目名称和包上附加的所有红叉 但现在我无法使该应用程序在我的 Eclipse 和 tomcat6 开发环境上运行 在项目属性中 当我尝试设置部
  • Java中的整数除法[重复]

    这个问题在这里已经有答案了 这感觉像是一个愚蠢的问题 但我在 Java 文档中找不到答案 如果我声明两个 int 然后将它们相除 到底发生了什么 他们是否转换为floats doubles首先 划分 然后投射回integer 或者除法是作为
  • 如何从 ArrayList 中删除空白项。不删除索引

    public class ArrayListTest public static void main String args ArrayList al new ArrayList al add al add name al add al a
  • Spring MVC 配置启用

    我正在从头开始建立一个项目 目前我正在配置Spring MVC 4 1 5使用java配置 整个应用程序正在 tomcat gradle 插件上运行 有人可以解释一下为什么我需要对班级进行以下调用DefaultServletHandlerC
  • Java switch case 抛出 nullPointer 异常

    我有一个枚举声明如下 public enum Status REQ URL1 NOT URL2 GET URL3 String getURL Status String getURL this getURL getURL 我班上的一个领域
  • Spring框架中的DAO和Service层到底是什么?

    Spring框架中的DAO和Service层到底是什么 我正在寻找理论答案 就 Spring 而言 没有区别 按照惯例 您可以使用以下方式标记 DAO 类 Repository和服务 Service 前者还进行一些持久层异常转换 既然您在理
  • 没有 if 条件(动态查询)或乱码的Where子句中的PreparedStatement“为null”

    假设我有这样的查询 SELECT FROM CUSTOMERS WHERE CUSTOMER ID 使用PreparedStatement 我可以绑定变量 pstmt setString 1 custID 但是 我无法通过以下绑定获得正确的
  • 将一组 Java 对象转换为另一组对象的最佳方式是什么?

    这是一个真正的新手提出的基本 Java 问题 我有一组实现某个接口 接口 MyIfc 的Java对象 属于 MyClass 类 我有一组这些对象存储在我的类中的私有变量中 声明如下 protected Set
  • 为什么 JPA/hibernate 不能映射到 MySQL blob 类型?

    我收到以下错误 Caused by org hibernate HibernateException Wrong column type in TestTable for column PAYLOAD Found blob expected
  • 将 LinkedHashset 内容复制到新的 ArrayList?

    我有一个最初包含一些内容的 listView 如果它得到相同的内容 我通过删除重复linkedhashset 现在 我想复制linkedhashset内容 即没有重复的内容到新的ArrayList 我尝试复制通过 p addAll 0 lh
  • 无法向 openfire 服务器发送消息

    我无法使用 SMACK API 向 openfire 服务器上的 XMPP 客户端发送消息 我不确定我哪里出错了 我在 gtalk 上测试了相同的代码 它工作正常 public class SenderTest public static
  • 如何在javafx中通过事件传递参数?

    我有以下示例 我想将参数 文本 与事件一起传递 当单击按钮 bla 时 我该怎么做 EventHandler
  • Java如何处理IF语句和效率

    我只是好奇 Java 实际是如何工作的if声明 注意 当我在下面说 组件 时 我指的是语句检查的各个部分 例如a b c 哪个在计算方面更有效 if a b c do stuff or if a if b if c do stuff 我之所
  • 从 MySql 迁移:MariaDB 服务器意外关闭客户端连接

    由于许可 商业使用原因 我们正在从 MySql 迁移到 MariaDB 我们已经成功用 MariaDB 客户端 jar 替换了 MySql 连接器 jar 第一次更改 现在正在尝试用 MariaDB 服务器替换 MySql 服务器而不更改数
  • 如何反序列化数组 google-gson 内的数组

    我有这样的 JSON Answers Locale Ru Name Name1 Locale En Name Name2 Locale Ru Name Name3 Locale En Name Name4 正如你所看到的 我的数组里面有数组
  • FileNotFoundException(系统找不到指定的路径)

    我得到这个例外 java io FileNotFoundException C filename xml The system cannot find the path specified 使用此代码 FileWriter fileWrit
  • 如何处理MaxUploadSizeExceededException

    MaxUploadSizeExceededException当我上传的文件大小超过允许的最大值时 会出现异常 我想在出现此异常时显示错误消息 如验证错误消息 我该如何处理这个异常 以便在 Spring 3 中执行类似的操作 Thanks 这
  • Java 中的引用变量里面有什么?

    我们知道对象引用变量保存表示访问对象的方式的位 它不保存对象本身 但保存诸如指针或地址之类的东西 我正在阅读 Head First Java 第 2 版 一书 书中写道 第 3 章第 54 页 在 Java 中我们并不真正知道什么是 在引用
  • GWT 和身份验证

    保护 GWT Tomcat 应用程序执行身份验证和授权的最佳策略是什么 有两种基本策略 确保入口点安全 确保远程服务的安全 确保入口点安全 最简单的方法是使用常规 Web 应用程序安全工具限制对 GWT 生成的 html js 文件的访问

随机推荐

  • Dubbo是什么

    Dubbo是什么 Dubbo是一个分布式服务框架 致力于提供高性能和透明化的RPC远程服务调用方案 以及SOA服务治理方案 简单的说 dubbo就是个服务框架 如果没有分布式的需求 其实是不需要用的 只有在分布式的时候 才有dubbo这样的
  • 统计oracle 数据库 lawpeople表lawtype字段多个值只统计一次问题,按照地区分类

    select temparea name case when lawtype like 501 then 501 when lawtype like 502 then 502 when lawtype like 503 then 503 w
  • CSR867x — 如何看懂一份psr文件

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX 作 者 文化人 XX 联系方式 XX 版权声明 原创文章 欢迎评论和转载 转载时能告诉我一声就最好了 XX 要说的话 作者
  • Dubbo路由规则:静态标签的使用与扩展

    一 路由的流程 路由是通过互联网把信息从源地址传输到目的地址的过程 而决定路由目标地址的是路由规则 在Dubbo里 路由规则在发起一次RPC调用前起到过滤目标服务器地址的作用 过滤后的地址列表 将作为消费端最终发起RPC调用的备选地址 它能
  • LeetCode 62. 不同路径

    欢迎来到茶色岛独家岛屿 本期将为大家揭晓LeetCode 62 不同路径 做好准备了么 那么开始吧 一 题目名称 LeetCode 62 不同路径 二 题目要求 一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start
  • git 导出版本之间差异文件

    查看 commit id 首先用 git log 查看版本库日志 找出需要导出的 commit id git log pretty oneline 456bcbccd91278f7fdf6bf11bc73c4e3a6193c7f HEAD
  • 基于深度神经网络的社交媒体用户级心理压力检测

    User Level Psychological Stress Detection from Social Media Using Deep Neural Network 基于深度神经网络的社交媒体用户级心理压力检测 ABSTRACT It
  • 软件anyconnec-win安装下载

    anyconnec win介绍 1 安装下载地址 http www drv5 cn sfinfo 14287 html softdown 找到适合自己操作系统的版本 下载并安装 2 直接安装下载点击next就ok了 需要注意的是 下载安装完
  • IDEA小技巧

    IDEA小技巧 常用快捷键 Alt Insert 可以自动生成get set toString方法 Alt Enter 可以帮助解决各种报错 抛个异常啊 导个包啊之类的 常见行操作 Shift Enter 添加空行 相比普通换行 不管光标在
  • [Pytorch系列-48]:如何查看和修改预定义神经网络的网络架构、网络参数属性

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121342500 目录 第1章 Fin
  • python简单作图的一些设置(4.11课堂笔记)

    1图片布局 1 画布大小 宽 高 英寸 A4 21cm 29 7cm 约7英寸 还要减去页边距 fig plt figure figsize 4 7 2 画图 纸的形状决定图的形状 2 1 不能控制图的形状 ax fig add subpl
  • 力扣每日一题:915. 分割数组【思维题】

    给定一个数组 nums 将其划分为两个连续子数组 left 和 right 使得 left 中的每个元素都小于或等于 right 中的每个元素 left 和 right 都是非空的 left 的长度要尽可能小 在完成这样的分组后返回 lef
  • Redis崩了,我成功把锅甩给了隔壁组

    项目起不来了 项目又起不来了 又双叒叕 上周经常听到组里同事说项目又双叒叕挂了 Redis连不上 笔者在另一套正常的环境忙着开发新需求 没空关心这个问题 PS 反正我的环境能用 先忙完我的再说 于是乎 看了一眼日志 连接数过多 emmm 顺
  • nodejs格式化输入

    需求 比如我现在要格式为Axxx xxx xxx是数字 的格式 但是输入有可能为A1 2这种情况 就需要补零 变成A001 002 代码实现 const regex A d d 正则匹配桩号合法格式 const match input ma
  • baidu 百度搜索 命令

    命令 含义 双引号 xx 关键字全匹配 减号 xxx 排除xxx关键字 Inurl xxx 在url中匹配关键字 intitle xxx title标签中进行匹配 Site xxx 指定域名下搜索 Filetype txt 指定文件类型 例
  • 深入理解Python装饰器与闭包

    最初学习Python时 了解到装饰器与闭包的概念 在网上看了很多博客与教程 总觉得自己的理解还是不那么透彻 最近开始学习 流畅的Python 一书 书中对与闭包和装饰器有详细的解释 我觉得写的非常到位 现在把我的理解分享出来与大家共同探讨
  • Android开发失业50天,面了10家公司,唯二的offer也主动拒了

    最近在论坛看到这样一个帖子 坐标深圳 4 月上旬公司解散 现在想想好像是假解散 真裁员 这一个半月以来 从朋友内推 到拉勾 Boss 直聘 再到猎聘 智联招聘 从开始的精准投递 到后来的海投 加起来投递了上百家公司吧 面了差不多 10 家公
  • MinGW下载并配置gcc/g++编译环境

    本文将讲解如何下载MinGW并配置gcc g 编译环境 方案一 官网下载 一 下载MinGW 在MinGW官网中下载 mingw get setup exe 官网传送门 http www mingw org 如果您下载的过程非常艰难 请采用
  • 【马士兵】Python基础--05(循环)

    Python基础 05 文章目录 Python基础 05 range函数 while循环 for item in 迭代对象 break continue else语句 循环嵌套 range函数 这个函数生成的是一个整数序列 他的返回值是一个
  • 动态代理 [用jdk实现]

    一 java 的jdk動態代理 用JDK實現的動態代理 被代理的對象必須實現一個接口才可以 其實現主是通過java lang reflect Proxy類和 java lang reflect InvocationHandler接口 二 本