`

java 代理机制实现

阅读更多

Proxy 模式


代理的主要类:java.lang.reflect.Proxy
它定义了一套静态方法,供我们使用,其中一个最常用的方法就是生成代理对象,动态代理机制的核心是 InvocationHandler 接口
代理对象
public static Object newProxyInstance(ClassLoader loader,
                                      Class<?>[] interfaces,
                                      InvocationHandler h)
                               throws IllegalArgumentException


它根据你传入的类加载器和这个代理将会实现的接口,以及一个调用处理器,来生成一个代理对象.
核心接口
public interface InvocationHandler {
    Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;
}

请看例子:
接口1:
package com.ben.proxy;

/**
 * <pre>
 * </pre>
 * @author ben.liu
 * @version 1.0, 2008-9-23
 */
public interface Talk
{
	public void talk(String someone);
}

实现类1:
package com.ben.proxy;

/**
 * <pre>
 * </pre>
 * @author ben.liu
 * @version 1.0, 2008-9-23
 */
public class MyTalk implements Talk
{

	public void talk(String someone)
	{
		System.out.println("talk to "+someone);
	}

}

接口2:
package com.ben.proxy;

/**
 * <pre>
 * </pre>
 * @author ben.liu
 * @version 1.0, 2008-9-23
 */
public interface Write
{
	public void hello(String name);

	public void doAction();
}

实现类2:
package com.ben.proxy;

/**
 * <pre>
 * </pre>
 * @author ben.liu
 * @version 1.0, 2008-9-23
 */
public class MyWrite implements Write
{

	public void doAction()
	{
		System.out.println("doAction is done");
	}

	public void hello(String name)
	{
		System.out.println("hello !"+name);
	}

}

动态代理:
package com.ben.proxy;

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

/**
 * <pre>
 * 动态代理对象
 * </pre>
 * @author ben.liu
 * @version 1.0, 2008-9-23
 */
public class MyProxy<T> implements InvocationHandler
{
	private T t;

	public MyProxy(T t)
	{
		this.t = t;
	}

	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
	{
		System.out.println("--------proxy:----" + proxy.getClass());
		System.out.println("--------Method:---" + method);
		System.out.println("--------args:-----" + args);
		if (args != null)
		{
			for (Object o : args)
				System.out.println("---------" + o);
		}

		return method.invoke(t, args);
	}

}

将两个接口绑定到代理来调用,实现不同的事情。示例如下:
package com.ben.proxy;

import java.lang.reflect.Proxy;

/**
 * <pre>
 * 代理机制示例
 * </pre>
 * @author ben.liu
 * @version 1.0, 2008-9-23
 */
public class MyProxyFactory
{
	private Object o;

	public void bond(Object o)
	{
		this.o = o;
		doSth();
	}

	public void doSth()
	{
		if (o instanceof Talk)
		{
			Talk t = (Talk) Proxy.newProxyInstance(Talk.class.getClassLoader(), new Class[] { Talk.class },
					new MyProxy(o));
			t.talk("ben");
		}
		if (o instanceof Write)
		{
			Write w = (Write) Proxy.newProxyInstance(Write.class.getClassLoader(), new Class[] { Write.class },
					new MyProxy(o));
			w.doAction();
			w.hello("bensoft");
		}
	}

	public static void main(String[] args)
	{
		Talk t = new MyTalk();
		Write w = new MyWrite();
		MyProxyFactory ft = new MyProxyFactory();
		ft.bond(t);
		ft.bond(w);
	}
}

通过以上MyProxyFactory类的绑定,将多个接口要做的事情在一个类中即可实现。
分享到:
评论
1 楼 crabboy 2009-07-15  
层次分明,看明白了。

相关推荐

    java动态代理机制

    Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...

    java代理机制 JDK动态代理和cglib代理 详解

    Java代理机制是Java编程中一个重要的特性,它允许我们在不修改原有代码的基础上,为已有类增加额外的功能。本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口...

    利用反射和动态代理机制实现自定义拦截器Interceptor

    利用反射和动态代理机制实现自定义拦截器Interceptor 在本文中,我们将探讨如何利用反射和动态代理机制来实现自定义拦截器Interceptor。拦截器Interceptor是一种常见的设计模式,用于在方法调用前后执行某些操作,...

    利用JAVA代理Proxy机制实现spring对ibaits的MapperScannerConfigurer功能

    利用JAVA代理Proxy机制实现spring对ibaits的MapperScannerConfigurer功能 详细:http://blog.csdn.net/wq105032007067/article/details/8812598

    JAVA的反射机制与动态代理

    Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...

    浅谈java代理机制 .txt

    Java代理机制是软件开发中一个重要的技术手段,特别是在实现面向切面编程、增强类的功能等方面有着广泛的应用。通过理解并掌握Java代理机制,开发者可以更加灵活地应对复杂的业务需求,提高代码的可扩展性和可维护性...

    Java动态代理两种实现方式

    总结来说,Java动态代理为开发者提供了灵活的代码扩展机制,可以根据实际需求选择适合的实现方式。JDK动态代理适用于接口丰富的场景,而Cglib更适合对性能有较高要求或者目标对象无法实现接口的情况。

    基于Java动态代理和反射机制实现ORM

    在Java中,基于动态代理和反射机制实现ORM可以提高代码的可维护性和灵活性。本篇文章将深入探讨如何在Java环境下,结合MySQL数据库,利用动态代理和反射技术来实现简单的ORM框架。 首先,我们需要了解动态代理和...

    java动态代理机制综合分析以及实现

    ### Java动态代理机制综合分析以及实现 #### 引言 Java动态代理机制为开发者提供了无需手动编写代理类的便利方式,只需指定一组接口及委托类对象即可动态获得代理类。这种代理类能够自动将所有方法调用分派到委托...

    JAVA 反射机制与动态代理ppt

    - **动态代理**:Java中的动态代理机制基于反射,可以创建一个代理类来拦截并处理方法调用,例如用于AOP(面向切面编程)。 - **插件系统**:在运行时加载未知的插件类,实现模块化和扩展性。 - **测试工具**:单元...

    Java动态代理机制详解[整理].pdf

    Java动态代理机制是一种在运行时创建代理类和代理对象的技术,它允许我们在不修改源代码的情况下,对已有的接口或类进行扩展,增加新的功能。动态代理主要应用于事件监听、事务处理、性能监控等场景,提供了更加灵活...

    spring aop代理列子

    package com.gc.aop下为:aop方式... ... ... ... ... package com.gc.javaproxy下为:java代理机制实现 package com.gc.proxy下为:自定义代理模式(面向接口编程) package com.gc.normal下为:通用日志处理方式

    JAVA实现动态代理的简单流程

    在深入探讨Java动态代理的实现过程之前,我们首先需要理解动态代理的基本概念及其在Java中的应用价值。动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过...

    Java代理模式Java动态代理

    通过上述介绍,我们可以看到Java代理模式及其动态代理机制为开发者提供了强大的功能扩展能力。无论是通过代理模式控制对象的访问,还是利用Java动态代理实现特定时刻的行为增强,都是在不改变现有代码结构的前提下...

    java代理机制

    总结起来,Java代理机制通过动态生成代理类和使用InvocationHandler接口,实现了对目标对象的透明代理,为开发者提供了在方法调用前后插入自定义逻辑的能力,从而提高了代码的可复用性和灵活性。这种机制在设计模式...

    JAVA动态代理机制

    通过学习和理解Java动态代理机制,开发者可以更好地实现解耦和扩展性,尤其是在需要对业务逻辑进行增强或拦截的情况下。这个机制在AOP框架(如Spring AOP)中扮演着核心角色,帮助开发者实现非侵入式的代码增强。

    java动态代理机制分析及拓展

    Java动态代理机制的优点在于灵活性和便捷性,它允许在运行时动态创建符合特定接口的代理对象,无需对原有代码做任何修改,使得我们可以方便地实现诸如日志、事务控制等跨切面的逻辑。不过,动态代理仅限于代理接口,...

    java动态代理实现详解

    Java 动态代理是Java平台提供的一种强大的工具,它允许我们在运行时动态生成代理类,这些代理类可以实现一组指定的接口,同时还能在方法调用前后添加自定义的行为。这种机制大大简化了面向切面编程(AOP)和事件监听...

    Java实现动态代理

    动态代理通常用于实现AOP(面向切面编程)或者提供一种机制来增强对象的功能,比如日志、事务管理、性能监控等。 Java中的动态代理主要有两种实现方式:JDK动态代理和CGLIB动态代理。 1. **JDK动态代理**: JDK...

Global site tag (gtag.js) - Google Analytics