动态代理和普通的代理模式的区别,就是动态代理中的代理类是由java.lang.reflect.Proxy类在运行期时根据接口定义,采用Java反射功能动态生成的。
和java.lang.reflect.InvocationHandler结合,可以加强现有类的方法实现。
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:
(1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, J2EEjava语言JDK1.4APIjavalangObject.html">Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。这个抽象方法在代理类中动态实现。
(2).Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容:
Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。
Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。
所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。(参见文献3)
在使用动态代理类时,我们必须实现InvocationHandler接口,以第一节中的示例为例:
抽象角色(之前是抽象类,此处应改为接口):
public interface Subject
{
abstract public void request();
}
具体角色RealSubject:同上;
代理角色:
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;
public class DynamicSubject implements InvocationHandler {
private Object sub;
public DynamicSubject() {
}
public DynamicSubject(Object obj) {
sub = obj;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before calling " + method);
method.invoke(sub,args);
System.out.println("after calling " + method);
return null;
}
}
该代理类的内部属性为Object类,实际使用时通过该类的构造函数DynamicSubject(Object obj)对其赋值;此外,在该类还实现了invoke方法,该方法中的
method.invoke(sub,args);
其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,args为执行被代理对象相应操作所需的参数。通过动态代理类,我们可以在调用之前或之后执行一些相关操作。
客户端:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Client
{
static public void main(String[] args) throws Throwable
{
RealSubject rs = new RealSubject(); //在这里指定被代理类
InvocationHandler ds = new DynamicSubject(rs); //初始化代理类
Class cls = rs.getClass();
//以下是分解步骤
/*
Class c = Proxy.getProxyClass(cls.getClassLoader(),cls.getInterfaces()) ;
Constructor ct=c.getConstructor(new Class[]{InvocationHandler.class});
Subject subject =(Subject) ct.newInstance(new Object[]{ds});
*/
//以下是一次性生成
Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),
cls.getInterfaces(),ds );
subject.request();
}
通过这种方式,被代理的对象(RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变,控制的方式(DynamicSubject类)也可以动态改变,从而实现了非常灵活的动态代理关系
分享到:
相关推荐
using Castle.DynamicProxy; public class SimpleSamepleEntity { public virtual string Name { get; set; } public virtual int Age { get; set; } public override string ToString() { return string....
Java反射(Reflection)和动态代理(Dynamic Proxy)是Java编程中的高级特性,它们为程序提供了强大的功能和灵活性。本文将深入探讨这两个主题,并通过源码分析来加深理解。 首先,让我们了解一下Java反射。反射机制...
本文将深入探讨如何使用Spring的IOC和DI特性,结合动态代理(Dynamic Proxy)来实现一种类似AOP(面向切面编程)的功能,以达到在不修改原有代码的情况下增强或拦截方法调用的目的。 **一、Spring IOC(控制反转)*...
package cn.sxt.dynamicproxy; import java.util.ArrayList; import java.util.List; import cn.sxt.service.UserService; import cn.sxt.service.UserServiceImpl; public class Client { public ...
在WCF中,可以使用`Castle.DynamicProxy`库或者.NET Framework的`System.Reflection.Emit`命名空间来创建动态代理,从而在调用WCF服务时添加日志、事务控制等特性,而无需修改服务契约接口。 **WCF动态调用** 是指...
Castle.DynamicProxy是一个强大的动态代理库,它允许我们在运行时创建类的代理,这些代理可以拦截并处理方法调用、属性访问等。通过使用Castle.DynamicProxy,我们可以创建一个动态代理类,该类将作为IBatisNET中的...
**Java动态代理(Dynamic Proxy)** Java动态代理是Java提供的一种机制,可以在运行时创建具有特定接口的代理类。这通常用于实现AOP(面向切面编程)或事件处理等。主要由java.lang.reflect.Proxy和java.lang....
这是动态代理的简单实例,方便学,入手.这个例子非常的简单哦!
JDK动态代理,全称为Java Dynamic Proxy,是Java标准库提供的一种强大且灵活的机制,允许我们在运行时创建代理类来实现指定的接口。这种机制主要用于实现AOP(面向切面编程)或为已有接口提供额外的功能,如日志、...
在上面的示例中,我们定义了一个动态代理类DynamicProxy,它实现了InvocationHandler接口。我们可以通过DynamicProxy对象来代理RealSubject对象,并对其方法调用进行处理和修改。 四、结论 Java动态代理语法Proxy...
绿色软件,无需安装,可以自动添加、修改代理服务器ip地址
Service dynamicProxy = (Service) Proxy.newProxyInstance( Service.class.getClassLoader(), new Class[]{Service.class}, new DynamicProxy(new RealService()) ); dynamicProxy.doSomething(); ``` 动态...
如果使用LinFu.DynamicProxy动态代理,引用NHibernate.ByteCode.LinFu.dll程序集并配置proxyfactory.factory_class节点为 <property name="proxyfactory.factory_class"> NHibernate.ByteCode.LinFu....
在这个“dynamic-proxy-demo.zip”压缩包中,我们可能找到了关于这两种代理模式的示例代码。 首先,让我们来深入理解动态代理和静态代理的概念。 **静态代理:** 静态代理是最基础的形式,它通过创建目标对象的...
在动态代理中,我们创建了一个 `DynamicProxy` 类实现 `InvocationHandler` 接口,然后使用 `Proxy.newProxyInstance()` 方法创建代理对象。`invoke()` 方法会拦截所有对代理对象的方法调用,从而可以在调用前后添加...
`Proxy` 类是用于创建动态代理对象的工厂,而`InvocationHandler`接口则定义了代理对象如何处理方法调用的逻辑。 1. **Proxy类**: `Proxy` 类提供了`newProxyInstance()`静态方法,它是创建动态代理对象的主要...
在Java编程中,动态代理(Dynamic Proxy)是一种强大的设计模式,它允许我们在运行时创建具有特定接口的新对象。Java的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口...
Service proxyService = (Service) DynamicProxy.getProxyInstance(realService); proxyService.doSomething(); ``` 代理模式在软件开发中有广泛的应用,例如在远程调用、事务管理、缓存控制、权限验证等场景。在...
在动态代理中,我们创建了一个实现了 `InvocationHandler` 接口的 `DynamicProxy` 类。`invoke()` 方法是关键,它会在调用真实对象的方法之前和之后添加额外的逻辑。使用 `Proxy.newProxyInstance()` 可以生成一个...
动态代理(DynamicProxy)是Java中一种强大的设计模式,它允许在运行时创建代理对象,这些代理对象可以作为原对象的“代理”,在调用原对象的方法时添加额外的功能,如日志、性能监控、事务处理等。在Java中,`java....