`

Dynamic Proxy模式

 
阅读更多

ProxyFactory类

package com.zzq.proxy;

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

public class ProxyFactory implements InvocationHandler{
 
	private Object target;
	
	public ProxyFactory() {}
	
	public void setTarget(Object target) {
		this.target = target;
	}

	public Object createProxyBean() {
		
		return Proxy.newProxyInstance(
					target.getClass().getClassLoader(), 
					target.getClass().getInterfaces(), 
					this
				);
	}
	
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		
		Object result = null;
		try {
			this.before();
			
			result = method.invoke(target, args);
			
			this.afert();
		} catch (Exception e) {
			afterThrow(e);
		}
		return result;
	}
	
	public void before() {
		System.out.println("before");
	}
	
	public void afert() {
		System.out.println("afert");
	}
	
	public void afterThrow(Throwable t) {
		System.out.println("afterThrow");
		
		if(t instanceof InvocationTargetException) {
			t = t.getCause();
			System.out.println(t.getMessage());
		} else {
			System.out.println(t.getMessage());
		}
	}
}

 

package com.zzq.proxy;

public interface SimpleBean {

	public void sayHello();
	
	public void throwException();
}

 

package com.zzq.proxy;

public class SimpleBeanImpl implements SimpleBean {

	public void sayHello() {
		System.out.println("hello proxy pattern!");
	}
	
	public void throwException() {
		throw new RuntimeException("出错了");
	}
	
	public static void main(String[] args) {
		ProxyFactory factory = new ProxyFactory();
		
		factory.setTarget(new SimpleBeanImpl());
		
		SimpleBean proxy = (SimpleBean)factory.createProxyBean();
		
		proxy.sayHello();
		
		proxy.throwException();
	}
}

 

分享到:
评论

相关推荐

    Castle.DynamicProxy.zip

    《解决IBatisNET v1.x在.NET 4.0下'Ambiguous match found'问题:Castle.DynamicProxy深度解析》 在.NET开发过程中,框架的选择和兼容性问题是开发者常常面临的挑战。其中,IBatisNET作为一款优秀的数据访问层框架...

    SpringIOC,DI+dynamic proxy 实现盗版AOP

    本文将深入探讨如何使用Spring的IOC和DI特性,结合动态代理(Dynamic Proxy)来实现一种类似AOP(面向切面编程)的功能,以达到在不修改原有代码的情况下增强或拦截方法调用的目的。 **一、Spring IOC(控制反转)*...

    WCF.rar_ChannelFactory_WCF DynamicProxy_WCF 动态_wcf 动态调用_动态WCF

    在本示例中,`ChannelFactory` 和 `DynamicProxy` 是两个关键概念,它们与WCF中的动态调用密切相关。 **ChannelFactory** 是WCF客户端编程模型中的一个重要组件。它是一个工厂模式的实现,用于创建与服务契约相匹配...

    DynamicProxy源码

    动态代理(DynamicProxy)是Java中一种强大的设计模式,它允许在运行时创建代理对象,这些代理对象可以作为原对象的“代理”,在调用原对象的方法时添加额外的功能,如日志、性能监控、事务处理等。在Java中,`java....

    DynamicProxy:一个简单实用的JDK动态代理演示

    通过`Proxy`和`InvocationHandler`,我们可以方便地实现诸如日志记录、性能监控、事务管理等功能,这在设计模式中被称为“代理模式”。在实际开发中,尤其是在服务治理、AOP(面向切面编程)等领域,动态代理有着...

    MEF+Caliburn.Micro+Validation+AOP

    例如,通过MEF加载实现`INotifyDataErrorInfo`接口的验证服务,这些服务可以利用Castle DynamicProxy来拦截和增强视图模型的方法调用,进行数据验证。同时,Caliburn.Micro则负责处理视图和视图模型的交互,提供简单...

    dynamic-proxy-demo.zip

    在这个“dynamic-proxy-demo.zip”压缩包中,我们可能找到了关于这两种代理模式的示例代码。 首先,让我们来深入理解动态代理和静态代理的概念。 **静态代理:** 静态代理是最基础的形式,它通过创建目标对象的...

    java 设计模式之代理模式(Proxy Pattern)实现代码及设计详解:动态代理模式、静态代理模式

    Service proxyService = (Service) DynamicProxy.getProxyInstance(realService); proxyService.doSomething(); ``` 代理模式在软件开发中有广泛的应用,例如在远程调用、事务管理、缓存控制、权限验证等场景。在...

    DYNAMIC PROXY

    代理模式是设计模式中的一种,它提供了一种对目标对象进行增强的手段,即在不修改原有对象代码的情况下,通过代理对象来扩展或拦截目标对象的功能。在Java中,动态代理主要依赖于两个接口:`java.lang.reflect....

    proxy.rar java三种代理模式源码

    在"DynamicProxy"目录下的源码中,可以看到如何使用这些类和接口创建并操作动态代理的例子。 3. 接口代理(JDK动态代理): 接口代理是基于Java的反射机制实现的动态代理,适用于目标对象实现了接口的情况。在...

    dt.zip_spring_www.dynamic-proxy.c

    动态代理在Spring中主要用于实现面向切面编程(AOP),这是一个强大的设计模式,允许我们在不修改源代码的情况下,对应用程序的行为进行增强或拦截。 标题"dt.zip_spring_www.dynamic-proxy.c"暗示了这个压缩包包含...

    代理模式 proxy-learn.rar

    System.out.println("Before doing something by dynamic proxy..."); } private void afterDoing() { System.out.println("After doing something by dynamic proxy..."); } } ``` 3. **创建动态代理对象**...

    java静态代理、动态代理、装饰设计模式

    public class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method...

    Java中的代理模式Demo

    Target proxyTarget = (Target) DynamicProxy.getProxyInstance(realTarget); proxyTarget.doSomething(); ``` 代理模式在实际开发中的应用广泛,如AOP(面向切面编程)框架Spring的AOP代理,以及在数据库操作中...

    Java 代理模式

    Target dynamicProxy = (Target) Proxy.newProxyInstance( Target.class.getClassLoader(), new Class[]{Target.class}, new DynamicProxyHandler(realTarget) ); // 调用代理对象的方法 dynamicProxy....

    Java静态代理与动态代理demo

    在动态代理中,我们创建了一个 `DynamicProxy` 类实现 `InvocationHandler` 接口,然后使用 `Proxy.newProxyInstance()` 方法创建代理对象。`invoke()` 方法会拦截所有对代理对象的方法调用,从而可以在调用前后添加...

    JAVA设计模式之代理模式实例

    System.out.println("DynamicProxy: Before action..."); } private void after() { System.out.println("DynamicProxy: After action..."); } } // 客户端代码 public class Client { public static void ...

    Java两种代理模式案例

    你可以通过创建`Service`接口,实现`Target`和`Proxy`类(静态代理)以及`DynamicProxy`类(动态代理),然后通过调用`getInstance()`方法创建动态代理对象。运行这些示例,观察代理模式如何在实际场景中工作。 ...

    静态代理和动态代理

    Service dynamicProxy = (Service) Proxy.newProxyInstance( Service.class.getClassLoader(), new Class[]{Service.class}, new DynamicProxy(new RealService()) ); dynamicProxy.doSomething(); ``` 动态...

    proxy-demo.zip

    - 可能还有一个动态代理类(DynamicProxy),使用了`Proxy.newProxyInstance()`方法来创建代理对象,并实现了`InvocationHandler`接口,用于处理接口方法的调用。 此外,压缩包可能还包含测试类(Test)来展示如何...

Global site tag (gtag.js) - Google Analytics