Java设计模式---代理模式(动态代理)

news/2024/5/19 6:39:42 标签: java, 设计模式, proxy, 反射

Java设计模式---代理模式(动态代理):

a,动态代理设计模式不属于23种设计模式之一
b,动态代理设计模式=代理模式+反射机制
c,可以为项目中所有接口中所有方法进行增强。

动态代理设计模式的实现步骤:

1)创建被帮助对象的接口

package service;
public interface PGService {
	public void giveFlower();
}

2)创建被帮助对象的类

package serviceImp;
import service.PGService;
public class PG implements PGService{
	public void giveFlower() {
		System.out.println("This is the flower for you.");
	}
}

3)创建动态的 代理

package util;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;

//import service.PGService;
//import serviceImp.PG;
public class Agent implements InvocationHandler {
{this.zhangsan.giveFlower();System.out.println("Congratulations.");}
	private Object obj;
	public Agent(Object obj) {this.obj=obj;}
	/* 
	 * 第一个 (Object proxy)
	 * 第二个(Method method) 本次正常调用方法 update select save delete
	 * 第三个(Object[] args) 本次正常调用的方法运行时实参
	 * JVM接收到的一个命令,被帮助的对象,一个需要增强的方法。
	 * EmpService obj = xxxxxxx;
	 * object.save("mike",10000);
	 * JVM将当前命令分解,将save方法封装为Method类型对象。save方法运行时所得到的实参封装到一个Object类型的数组中["mike",10000]。
	 * 然后将这三个内容作为参数交给代理实现类中的invoke方法。
	 */
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
		//得到本次要增强的方法的名字
		String methodName = method.getName();
		//日志的输出
		System.out.println(new Date() +":"+ methodName+"开始执行");
		Object result = method.invoke(obj, args);//obj.save("mike",10000);
		System.out.println(new Date() +":"+ methodName+"执行结束");
		return result;}
	public Object getAgent() {
		/*
		 * 参数1:类加载器ClassLoader,正在帮助的对象隶属class
		 * 参数2:接口,正在帮助的对象的方法隶属的接口
		 * 参数3:代理实现类的对象。
		 * /
		 */
		Object lisi= Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
		return lisi;
	}
	}

4)创建测试 main类,进行测试

import java.lang.reflect.InvocationHandler;

import service.PGService;
import serviceImp.PG;
import util.Agent;

public class testMain {
	public static void main(String[] args) throws Exception {
		PGService person = new PG(); //实例化被帮助的对象
		InvocationHandler agent1 = new Agent(person);	//初始化代理
		PGService lisi = (PGService) ((Agent) agent1).getAgent();//让代理熟悉 被帮助对象的 方法
	    ((PGService) lisi).giveFlower();//代理开始工作
	}
}


http://www.niftyadmin.cn/n/876985.html

相关文章

linux计数脚本,shell脚本统计所有人有总钱数awk脚本

awk脚本awk脚本通常由以下3部分构成:BEGIN{ 这里面放的是执行前的语句 }END {这里面放的是处理完所有的行后要执行的语句 }{这里面放的是处理每一行时要执行的语句}下面这个例子来自于网上:假如有以下表:$ cat score.txtMarry 2143 78 84…

zabbix简介

监控的项目: 1)硬件监控 1.1)通过远程控制卡,如Dell的IDRAC,HP的ILO等。 1.2)使用IPMItool完成物理设备的监控工作,通产监控温度,硬盘故障。 1.3)路由器&#xff…

dw无法预览html,Dreamweaver编辑网页预览的时候显示乱码该怎么办?

很多初学前台设计的朋友是不是经常遇到写出来的网页乱码的问题,这里笔者今天也是无意中遇到这个情况,给大家分享一下希望能够帮助到大家1、首先我回顾一下出现问题的操作步骤,为了让大家看得更明白我把代码尽量缩减到最少了2、然后我用360浏览…

bcm4312 linux命令行,CentOS 6.0下 BCM4312 802.11b/g无线网卡驱动安装

安装完成CentOS 6.0 时,无线网络不能链接。提示没有发现设备。使用命令检测网卡 lspci | grep Network 为“06:00.0 Network controller: Broadcom Corporation BCM4312 802.11b/g LP-PHY (rev 01)” 下载最新的网卡驱动程序 hybrid-portsrc_x86_32-v5_100_82_38.…

zabbix的安装配置

Zabbix Server安装 1,获取IP地址,关闭防火墙 [userNewBieSlave2 ~]$ ifconfig | awk NR2{print $2} 192.168.1.99[rootNewBieSlave2 ~]# systemctl stop firewalld.service [rootNewBieSlave2 ~]# systemctl status firewalld.service ● firewalld.se…

linux6如何开启5096端口,10个Linux操作的好习惯

这是十条linux系统下命令行操作模式时应该遵守的好习惯,他们不仅可以让你的操作更快,也能减少你失误的可能性。它们分别是1.用一条mkdir语句建立一套完整的目录树示例:$mkdir-pproject/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}2.在…

html5 canvas dpi,html5 canvas中绘制字体与图片以及图形模糊问题解决

html5 canvas 绘制字体、图片与图形模糊问题发生情况多出现在高dpi设备,这意味着每平方英寸有更多的像素,如手机,平板电脑。当然很多高端台式电脑也有高分辨率高dpi的显示器。canvas在浏览器中的缩放原理如果没有设置style那么就以html的属性…

Kafka 2.* 源码阅读环境的搭建

Kafka 2.* 源码阅读环境的搭建 1)下载kafka源码包 https://mirrors.bfsu.edu.cn/apache/kafka/2.8.0/kafka-2.8.0-src.tgz 2)安装jdk(1.7以上版本) 3)下载Scala安装编译器包,并安装。https://downloads.…