`

动态代理类

阅读更多

       Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:

(1). Interface InvocationHandler:该接口中仅定义了一个方法Objectinvoke(Object obj,Method method, 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,由它接管实际的工作。

    在使用动态代理类时,我们必须实现InvocationHandler接口,以第一节中的示例为例:

抽象角色(之前是抽象类,此处应改为接口):

具体角色RealSubject:同上;

 

public interface Subject
{
    abstract public void request();
}

 

代理角色:

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)也可以动态改变,从而实现了非常灵活的动态代理关系

分享到:
评论

相关推荐

    spring动态代理类的示范小版本,很简单的例子

    这个"spring动态代理类的示范小版本,很简单的例子"应该是提供了一个简单易懂的示例,帮助我们理解Spring动态代理的工作原理。 在Spring中,动态代理主要有两种实现方式:JDK动态代理和CGLIB代理。它们都是为了实现...

    代理类,详细讲解一下动态代理类

    动态代理类是这种机制的一个变体,尤其适用于运行时生成代理类的情况。接下来,我们将详细讨论动态代理类的概念、其作用以及如何在实际开发中应用。 首先,代理类的主要作用在于提供额外的控制层。当直接调用目标...

    CGLIB 和 JDK生成动态代理类的区别

    性能方面,CGLIB通常比JDK动态代理更快,因为它是基于字节码生成的子类,而JDK动态代理需要创建接口的实现类。但是,如果目标类已经实现了接口,JDK动态代理的性能开销相对较小,因为它避免了子类继承带来的额外成本...

    动态代理类例子proxy

    动态代理类例子proxy动态代理类例子proxy动态代理类例子proxy

    对代理模式与Java动态代理类的理解

    对代理模式与Java动态代理类的理解说明

    动态代理及生成的代理类

    动态代理及其生成的代理类,可以反编译查看其类的结构。

    java 简答可复用动态代理类

    - `Proxy`类是Java提供的动态代理的工厂,它可以根据一个接口生成实现了该接口的代理类的对象。这个代理类会动态地生成并实现接口的所有方法。 - `InvocationHandler`接口定义了一个处理方法调用的回调方法`invoke...

    java动态代理类的实例

    在Java中,静态代理是通过定义一个与被代理类实现相同接口的新类来实现的,而动态代理则在运行时动态生成此类,无需预先编写代理类的代码。 `java.lang.reflect.Proxy`类是Java动态代理的核心,它提供了创建代理...

    CGlib动态代理类的jar包

    在Java编程中,动态代理是一种在运行时创建代理类和对象的技术,可以用于拦截方法调用,实现AOP(面向切面编程)或者为已有接口或类提供额外功能。CGlib是Java动态代理的一种实现方式,它不是依赖于Java的反射机制,...

    Java静态代理和动态代理

    动态代理类不需预先编写,而是由JVM在运行时根据接口动态生成。这样,我们可以通过接口而不是具体类来创建代理,使得代码更加灵活。 四、静态代理与动态代理的比较 1. **灵活性**:动态代理比静态代理更灵活,因为...

    Mybatis的Mapper方式整合elasticsearch的DSL调用,基于接口和代理生成bean注入的方式进行调用

    为了解决这个问题,我们可以利用CGlib库来创建动态代理类。CGlib是一个强大的字节码生成库,它可以在运行时生成新的类和接口的实例,这正是我们需要的——为每个Mapper接口创建一个代理类,以便在调用实际方法之前...

    关于jdk动态代理的源码剖析

    3. **内部持有`InvocationHandler`实例**:动态代理类内部持有一个`InvocationHandler`实例,这个实例用于处理代理对象的所有方法调用。 #### 五、动态代理的核心——`InvocationHandler` `InvocationHandler`是...

    JAVA类加载机制与动态代理

    - **动态语言支持**:例如使用`java.lang.reflect.Proxy`类来创建动态代理类。 - **自定义代码生成**:通过编写代码来手动生成代理类的字节码。 ##### 2.2 动态代理的概念 动态代理允许我们为一个接口创建一个代理...

    java动态代理实现详解

    在生成动态代理类时,需要提供一个类加载器来确保代理类能够被正确加载和使用。 使用Java动态代理的步骤: 1. 实现`InvocationHandler`:创建一个类实现`InvocationHandler`接口,重写`invoke()`方法。在这里可以...

    CGLIB动态代理类库

    对目标对象进行继承扩展,为其生成相应的子类,而子类可以通过覆写来扩展父类的行为,只要将横切逻辑的实现放到子类中,然后让系统使用扩展后的目标对象的子类,就可以达到与代理模式相同的效果了。

    JDK动态代理_JDK动态代理

    - **`java.lang.reflect.Proxy`**:提供了创建动态代理类和实例的方法。通过`newProxyInstance`方法,传入ClassLoader、接口数组和InvocationHandler实例,即可创建一个动态代理对象。 - **`java.lang.reflect....

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

    2. `getProxyClass`: 根据类装载器和一组接口返回动态代理类的类对象。 3. `isProxyClass`: 判断指定的类是否是动态代理类。 4. `newProxyInstance`: 使用类装载器、一组接口和调用处理器生成动态代理类实例。 **...

    jdk动态代理技术详解

    Proxy 类是 JDK 中的动态代理类,是动态代理的核心类,其作用类似于代理模式中的代理。Proxy 类中包含的全是静态的方法和成员变量,这是一个纯粹的工具类,因此其源代码中含有一个私有的构造器,在某种意义上可以看...

    Java动态代理学习测试类

    在这个“Java动态代理学习测试类”中,我们将深入探讨这一主题。 1. **Java动态代理的基本概念** - 动态代理是在程序运行时生成接口的实现类,而无需在编译时就确定。这使得我们可以在运行时决定代理对象的行为。 ...

Global site tag (gtag.js) - Google Analytics