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();
}
}
分享到:
相关推荐
《解决IBatisNET v1.x在.NET 4.0下'Ambiguous match found'问题:Castle.DynamicProxy深度解析》 在.NET开发过程中,框架的选择和兼容性问题是开发者常常面临的挑战。其中,IBatisNET作为一款优秀的数据访问层框架...
本文将深入探讨如何使用Spring的IOC和DI特性,结合动态代理(Dynamic Proxy)来实现一种类似AOP(面向切面编程)的功能,以达到在不修改原有代码的情况下增强或拦截方法调用的目的。 **一、Spring IOC(控制反转)*...
在本示例中,`ChannelFactory` 和 `DynamicProxy` 是两个关键概念,它们与WCF中的动态调用密切相关。 **ChannelFactory** 是WCF客户端编程模型中的一个重要组件。它是一个工厂模式的实现,用于创建与服务契约相匹配...
动态代理(DynamicProxy)是Java中一种强大的设计模式,它允许在运行时创建代理对象,这些代理对象可以作为原对象的“代理”,在调用原对象的方法时添加额外的功能,如日志、性能监控、事务处理等。在Java中,`java....
通过`Proxy`和`InvocationHandler`,我们可以方便地实现诸如日志记录、性能监控、事务管理等功能,这在设计模式中被称为“代理模式”。在实际开发中,尤其是在服务治理、AOP(面向切面编程)等领域,动态代理有着...
例如,通过MEF加载实现`INotifyDataErrorInfo`接口的验证服务,这些服务可以利用Castle DynamicProxy来拦截和增强视图模型的方法调用,进行数据验证。同时,Caliburn.Micro则负责处理视图和视图模型的交互,提供简单...
在这个“dynamic-proxy-demo.zip”压缩包中,我们可能找到了关于这两种代理模式的示例代码。 首先,让我们来深入理解动态代理和静态代理的概念。 **静态代理:** 静态代理是最基础的形式,它通过创建目标对象的...
Service proxyService = (Service) DynamicProxy.getProxyInstance(realService); proxyService.doSomething(); ``` 代理模式在软件开发中有广泛的应用,例如在远程调用、事务管理、缓存控制、权限验证等场景。在...
代理模式是设计模式中的一种,它提供了一种对目标对象进行增强的手段,即在不修改原有对象代码的情况下,通过代理对象来扩展或拦截目标对象的功能。在Java中,动态代理主要依赖于两个接口:`java.lang.reflect....
在"DynamicProxy"目录下的源码中,可以看到如何使用这些类和接口创建并操作动态代理的例子。 3. 接口代理(JDK动态代理): 接口代理是基于Java的反射机制实现的动态代理,适用于目标对象实现了接口的情况。在...
动态代理在Spring中主要用于实现面向切面编程(AOP),这是一个强大的设计模式,允许我们在不修改源代码的情况下,对应用程序的行为进行增强或拦截。 标题"dt.zip_spring_www.dynamic-proxy.c"暗示了这个压缩包包含...
System.out.println("Before doing something by dynamic proxy..."); } private void afterDoing() { System.out.println("After doing something by dynamic proxy..."); } } ``` 3. **创建动态代理对象**...
public class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method...
Target proxyTarget = (Target) DynamicProxy.getProxyInstance(realTarget); proxyTarget.doSomething(); ``` 代理模式在实际开发中的应用广泛,如AOP(面向切面编程)框架Spring的AOP代理,以及在数据库操作中...
Target dynamicProxy = (Target) Proxy.newProxyInstance( Target.class.getClassLoader(), new Class[]{Target.class}, new DynamicProxyHandler(realTarget) ); // 调用代理对象的方法 dynamicProxy....
在动态代理中,我们创建了一个 `DynamicProxy` 类实现 `InvocationHandler` 接口,然后使用 `Proxy.newProxyInstance()` 方法创建代理对象。`invoke()` 方法会拦截所有对代理对象的方法调用,从而可以在调用前后添加...
System.out.println("DynamicProxy: Before action..."); } private void after() { System.out.println("DynamicProxy: After action..."); } } // 客户端代码 public class Client { public static void ...
你可以通过创建`Service`接口,实现`Target`和`Proxy`类(静态代理)以及`DynamicProxy`类(动态代理),然后通过调用`getInstance()`方法创建动态代理对象。运行这些示例,观察代理模式如何在实际场景中工作。 ...
Service dynamicProxy = (Service) Proxy.newProxyInstance( Service.class.getClassLoader(), new Class[]{Service.class}, new DynamicProxy(new RealService()) ); dynamicProxy.doSomething(); ``` 动态...
- 可能还有一个动态代理类(DynamicProxy),使用了`Proxy.newProxyInstance()`方法来创建代理对象,并实现了`InvocationHandler`接口,用于处理接口方法的调用。 此外,压缩包可能还包含测试类(Test)来展示如何...