`

11 动态代理的例子

阅读更多

结构如下 :

 

package com.client;

import com.intercept.Interceptor;
import com.intercept.MyProxy;
import com.target.Target;
import com.target.TargetInterface;

/**
 * 程序入口, 有main方法
 * 
 */
public class Client
{
	public static void main(final String[] args)
	{
		//目标对象,将被代理
		final TargetInterface target = new Target();

		//设置插入的对象,对象的"三个方法"将被插入到"目标对象"的方法前面,后面,异常时
		final Interceptor in = new Interceptor();

		//代理
		final MyProxy myProxy = new MyProxy();

		//目标类实现的接口
		final TargetInterface proxy = (TargetInterface) myProxy.getProxy(target, in);

		//代理对象(代理了目标对象 Target)
		proxy.doSomething();
		proxy.string();

	}
}
 
package com.intercept;

/**
 * 被插入的接口,
 * 
 */
public interface InterceptorInterface
{
	/**
	 * 在目标方法 前执行
	 */
	public void before();

	/**
	 * 在目标方法 后执行
	 */
	public void after();

	/**
	 * 在目标方法 异常时执行
	 */
	public void error();

}
 
package com.intercept;

/**
 * 被插入的方法, 普通方法
 * 
 */
public class Interceptor implements InterceptorInterface
{
	@Override
	public void error()
	{
		System.out.println("异常了");
	}

	public void before()
	{
		System.out.println("前面插入的方法");
	}

	public void after()
	{
		System.out.println("后面插入的方法");
	}
}
 
package com.target;

/**
 * TargetInterface接口 ,Target是本接口的实现类
 * 
 */
public interface TargetInterface
{
	void doSomething();

	void string();

}
 
package com.target;

/**
 * 目标类, 本类被代理 , 实现了TargetInterface接口
 * 
 */
public class Target implements TargetInterface
{

	@Override
	public void doSomething()
	{
		System.out.println("----作个体工作!---");

	}

	public void string()
	{
		System.out.println("string()被执行");
	}
}
 
package com.intercept;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 结合 把目标对象, 与包含要插入的方法的对象 结合起来
 * 
 */
public class MyHandler implements InvocationHandler
{

	private InterceptorInterface	interception;

	private Object					object;

	/**
	 * 目标对象,将被代理
	 */
	public void setObject(final Object object)
	{
		this.object = object;
	}

	/**
	 * 本接口的"实现类"的"三个方法"将被插入到"目标对象"的方法前面,后面,异常时
	 */
	public void setInterception(final InterceptorInterface interception)
	{
		this.interception = interception;
	}

	/**
	 * 结合
	 */
	@Override
	public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable
	{
		Object result = null;
		//先插入一个方法
		interception.before();

		try
		{
			//执行目标方法
			result = method.invoke(object, args);
		}
		finally
		{
			interception.error();
		}
		//后插入一个方法
		interception.after();
		return result;
	}

}
 
package com.intercept;

import java.lang.reflect.Proxy;

/**
 * 代理类, 核心
 * 
 */
public class MyProxy
{
	public Object getProxy(final Object object, final InterceptorInterface in)
	{
		final MyHandler myHandler = new MyHandler();

		//设置目标对象
		myHandler.setObject(object);

		//设置插入的对象,对象的"三个方法"将被插入到"目标对象"的方法前面,后面,异常时
		myHandler.setInterception(in);
		//返回代理对象
		return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), myHandler);
	}
}

 

 

附件中有eclipse 的java工程源码

  • 大小: 21.9 KB
分享到:
评论

相关推荐

    mybatis增删改查小例子(包括Dao开发和Mapper代理开发)

    MyBatis提供动态代理机制,可以通过注解`@Mapper`将Mapper接口自动代理成实现类。Spring Boot项目中,只需在配置类中启用MyBatis自动配置,并扫描Mapper接口所在的包。 ```java @Configuration @...

    JAVA100经典例子

    例子会展示如何获取类的信息,创建动态代理,以及调用私有方法和字段。 10. **注解(Annotation)**:注解是元数据的一种形式,可以用于代码分析,编译时或运行时的处理。例子会展示如何定义和使用自定义注解。 11...

    Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现.doc

    Spring AOP提供了两种代理方式:JDK动态代理和Cglib代理。 Cglib代理是Spring AOP在无法使用JDK动态代理(例如代理的目标对象没有实现接口)时的另一种选择。Cglib是一个强大的、高性能的代码生成库,它基于ASM库来...

    JAVA例子100

    7. **反射机制**:通过反射API动态获取类的信息并操作对象,如Class类的使用,以及newInstance()、getMethods()等方法。 8. **泛型**:解释泛型的概念,如何在类、接口和方法中使用泛型,以及类型通配符的运用。 9...

    django例子201511.epub.7z

    标题中的“django例子201511.epub.7z”表明这是一个关于Django框架的实例教程,被压缩为EPUB格式,并且是2015年11月版本的。EPUB是一种电子书格式,常用于存储含有文本、图片和多媒体内容的文档。而.7z则是7-Zip软件...

    《Java面向对象程序设计(第2版)》例子源代码

    11. **反射与动态代理**:反射允许程序在运行时检查和操作类、接口、方法等,动态代理则可以在运行时创建代理对象,拦截并处理方法调用。 12. **泛型**:泛型引入了类型参数,提高了代码的类型安全性和可读性,减少...

    java代理方法假设和验证的Proxy源码分析.docx

    在Java中,代理主要通过两种方式实现:接口代理(基于Java动态代理JDK Proxy)和类代理(基于CGLIB等库)。本文关注的是JDK的动态代理,它允许我们为给定的接口创建代理类,以便在调用接口方法时插入自定义逻辑。 ...

    asp有用的小例子

    #### 11. ASP与脚本编码 对于ASP脚本,为了防止XSS攻击和确保脚本安全性,可以使用Windows Script Encoder工具对ASP脚本进行编码。然而,这一操作需要IE5及以上版本的浏览器支持,并且需要安装相应的脚本引擎。 ##...

    Java 23种设计模式及例子

    - **描述**:动态地给一个对象添加一些额外的职责。就增加功能而言,装饰器模式相比生成子类更加灵活。 - **示例**:为文本处理添加多种格式化选项,如加粗、斜体等。 8. **代理模式**(Proxy) - **描述**:为...

    一些非常有趣的python爬虫例子,对新手比较友好

    9. **IP代理与反反爬虫策略**:为避免被目标网站封禁,需要了解如何使用IP代理池,以及如何设置User-Agent、Cookies等,模拟人类浏览行为。 10. **网页解析与数据提取**:除了BeautifulSoup,还可以学习其他解析库...

    Lotus.Domino.Web编程

    2.3.4 例子:动态嵌入式导航器 24 2.4 在表单和表单对象中使用HTML属性 25 2.4.1 标记的例子 26 2.4.2 例子:RTF文本域的属性 27 2.4.3 例子:cookie 27 2.5 使用表单操作按钮 28 2.6 使用热点 30 2.7 在表单内使用...

    15个jQuery的例子

    8. **事件委托**:使用`.on()`进行事件委托,如`$("body").on("click", ".myItem", function() {...})`,即使动态添加的".myItem"元素也能响应点击事件。 9. **插件使用**:jQuery拥有丰富的插件库,如Bootstrap、...

    dominoWEB编程

    2.3.4 例子:动态嵌入式导航器 24 2.4 在表单和表单对象中使用HTML属性 25 2.4.1 标记的例子 26 2.4.2 例子:RTF文本域的属性 27 2.4.3 例子:cookie 27 2.5 使用表单操作按钮 28 2.6 使用热点 30 2.7 在表单内使用...

    不间断滑动的UIScrollViw的使用例子

    接下来,我们需要设置`UIScrollView`的数据源和代理。在`UIViewController`中遵循`UIScrollViewDataSource`协议,实现`numberOfPages`(对应`numberOfSectionsInCollectionView`或`numberOfRowsInSection`)和`...

    设计模式的实验例子

    11. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问。在需要添加额外控制逻辑或者保护真实对象时,代理模式大显身手。 通过这次设计模式实验,你可以亲自实践并理解每种模式的核心思想、应用场景和...

    DesginPattern-20种设计模式的简单例子

    在这个“DesignPattern-20种设计模式的简单例子”中,我们将探讨20种经典的设计模式,并通过具体实例来理解它们的应用。 1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。单例模式常用于配置...

    java7源码-test1:测试1

    11、动态代理的例子,以及网上动态代理的例子--com.cn21.invocation包。 12、实现可以接受任意接口及其实现类的动态代理--com.cn21.invocation包. 13、实现接口之间的转换,即调用第一个接口会自动转换为第二个接口...

    书架.zipIOS应用例子源码下载

    自动布局系统用于在不同尺寸的屏幕上动态调整用户界面。源码可能包含了Auto Layout的约束设置。 12. **通知和代理**: 在iOS开发中,代理和通知是对象间通信的常见方式。源码可能展示了如何实现委托协议或者使用...

Global site tag (gtag.js) - Google Analytics