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

原创 2017年05月07日 01:22:36

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 代理方式;

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java动态代理模式jdk和cglib的2种实现以及二者的区别(AOP面向切面的前奏)

关于动态代理模式里面有两种实现,一种是jdk实现,一种是cglib来实现。 下面来整jdk来实现动态代理的Java实例。 jdk动态代理模式里面有个拦截器的概念,在jdk中,只要实现了Invocati...

Java 例子 反射实现 AOP 动态代理模式(Spring Aop实现原理)

我们写个例子看看我们最简单的解决方案 我们先写一个接口IHello.java代码如下:  1package sinosoft.dj.aop.staticaop;  2  3public i...

反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)

好长时间没有用过Spring了. 突然拿起书.我都发现自己对AOP都不熟悉了. 其实AOP的意思就是面向切面编程. OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决解...

反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)

好长时间没有用过Spring了. 突然拿起书.我都发现自己对AOP都不熟悉了. 其实AOP的意思就是面向切面编程. OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决解...

反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)

好长时间没有用过Spring了. 突然拿起书.我都发现自己对AOP都不熟悉了. 其实AOP的意思就是面向切面编程. OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决解...

反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)

转载地址:http://www.blogjava.net/DoubleJ/archive/2008/03/04/183796.html 好长时间没有用过Spring了. 突然拿起书.我都发现自己对A...

反射实现 AOP 动态代理模式(Spring AOP实现原理)

好长时间没有用过Spring了. 突然拿起书.我都发现自己对AOP都不熟悉了. 其实AOP的意思就是面向切面编程. OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决解...

反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)

好长时间没有用过Spring了. 突然拿起书.我都发现自己对AOP都不熟悉了. 其实AOP的意思就是面向切面编程. OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决解...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)