Java 动态代理的实现-代理模式--aop

java 的 动态代理是代理模式的一种,其利用jdk自带的反射功能 实现,源码位于 java.lang.reflect 下

动态代理的实现: Proxy类  + InvocationHandler (调用方法处理接口)

第一步:实现自己的 代理处理接口MyInvocationHander,接口给出了规范,需要自己是实现(处理场所)

第二步:jdk 动态代理的契入点是 interface,因此要 设计相应的接口Animal( 请求规范),并同时生产一个子类Dog(请求源-要吃东西),必须有规范证书

第三步:请求源Dog 到处理场所Proxy连接处理接口(MyInvocationHander),处理后 会虚拟出 一个dogB 帮dog 完成吃东西的动作。


直接贴代码:

第一:实现自己的 代理处理接口MyInvocationHander,接口给出了规范,需要自己是实现(处理场所)

package com.test.reflect;

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;
	}
	/** 
     * 执行代理对象的所有方法时都会被替换成执行如下的invoke方法 
     *  
     * proxy :代表动态代理对象; method:代表正在执行的方法 ;args :代表执行代理对象方法时传入的实参 
     */  
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		
		before();
		method.invoke(target, args);
		after();
		
		return null;
	}
	
	public void before(){
		System.out.println("before ...");
	}
	
	public void after(){
		System.out.println("after ...");
	}

	public Object getTarget() {
		return target;
	}

	public void setTarget(Object target) {
		this.target = target;
	}

}

第二:jdk 动态代理的契入点是 interface,因此要 设计相应的接口Animal( 请求规范),并同时生产一个子类Dog(请求源-要吃东西),必须有规范证书

package com.test.reflect;

/**
 * jdk 动态代理--切入点是 接口
 * 
 * 目标接口
 * @author zhangqingzhou
 *
 */
public interface Animal {

	public void eat();
}

package com.test.reflect;
/*
 * 目标类
 */
public class Dog implements Animal{

	@Override
	public void eat() {
		System.out.println(" The dog is like eatting");
		
	}

}

第三:请求源Dog 到处理场所Proxy连接处理接口(MyInvocationHander),处理后 会虚拟出 一个dogB 帮dog 完成吃东西的动作。

package com.test.reflect;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * 动态代理工厂,把真是的对象发进入
 * 出来 代理对象
 * @author zhangqingzhou
 *
 */
public class MyProxyFactory {

	public static Object getProxy(Object obj){
		
		InvocationHandler InvocationHander =new MyInvocationHandler(obj);
		
	   Object o=	Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), InvocationHander);
		
		return o;
	}
}

package com.test.reflect;


public class Test {

	public static void main(String[] args) {
		
	  Animal dog =	new Dog();
	  Animal  proxyDog =(Animal)	MyProxyFactory.getProxy(dog);
	  proxyDog.eat();
	  
	  
	  /**
	   * console
	   * before ...
 		The dog is like eatting
		after ...
	   */
	}
}


可以看到,我们可以通过这种方式 进行拦截时操作 在目的操作前后可以加上自己想要的操作,那么你是否会想到 spring -aop 面向切面编程 原理喝着一样,比如 操作失败 进行数据回滚操作;但此方式 要求必须实现接口(jdk动态代理要求),若是 class 则需要使用 cglib,在配置文件中可以设置 AOP 代理方式;

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值