`

动态代理-JDK动态代理

    博客分类:
  • java
 
阅读更多
引自:http://yy629.iteye.com/blog/681430
动态代理,可以对接口、类进行代理,其中jdk自带的动态代理,只能通过接口代理,其他如:asm、cglib、javaassist对两者均可代理,其中保存jdk动态类方法:
package demo;

import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Properties;

/**
 * @author yeyong
 */
public class ProxyTest2 {

  public static void main(String[] args) throws Exception {
    
    // 添加以下的几段代码, 就可以将代理生成的字节码保存起来了
    Field field = System.class.getDeclaredField("props");
    field.setAccessible(true);
    Properties props = (Properties) field.get(null);
    props.put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

    Package pkg = ProxyTest2.class.getPackage();
    if (pkg != null) {
      String packagePath = pkg.getName().replace(".", File.pathSeparator);
      new File(packagePath).mkdirs();
    }

    IA a = new IAImpl();
    InvocationHandlerImpl ih = new InvocationHandlerImpl(a);
    IA proxyA = (IA) Proxy.newProxyInstance(a.getClass().getClassLoader(),
         a.getClass().getInterfaces(), ih);

    proxyA.a();
  }
}

interface IA {
  void a();
  int b(String str);
}

class IAImpl implements IA {

  @Override
  public void a() {
    System.out.println("IAImpl.a()");
  }
  @Override
  public int b(String str) {
  System.out.println("IAImpl.b()");
    return 0;
  }
}

class InvocationHandlerImpl implements InvocationHandler {

  private Object target;

  public InvocationHandlerImpl(Object target) {
    this.target = target;
  }

  public Object invoke(Object proxy, Method method, Object[] args) 
      throws Throwable {
    System.out.println("before...");
    Object res = method.invoke(target, args);
    System.out.println("after...");
    return res;
  }
}

反编译后源码如下
package demo;

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

public final class $Proxy0 extends Proxy implements IA {
  private static Method m1;
  private static Method m4;
  private static Method m3;
  private static Method m0;
  private static Method m2;

  public $Proxy0(InvocationHandler paramInvocationHandler) {
    super(paramInvocationHandler);
  }

  public final boolean equals(Object paramObject) {
    try {
      return ((Boolean) this.h.invoke(this, m1, 
          new Object[] { paramObject })).booleanValue();
    } catch (RuntimeException localRuntimeException) {
      throw localRuntimeException;
    } catch (Throwable localThrowable) {
      throw new UndeclaredThrowableException(localThrowable);
    }
  }

  public final int b(String paramString) {
    try {
      return ((Integer) this.h.invoke(this, m4,
           new Object[] { paramString })).intValue();
    } catch (RuntimeException localRuntimeException) {
      throw localRuntimeException;
    } catch (Throwable localThrowable) {
      throw new UndeclaredThrowableException(localThrowable);
    }
  }

  public final void a() {
    try {
      this.h.invoke(this, m3, null);
      return;
    } catch (RuntimeException localRuntimeException) {
      throw localRuntimeException;
    } catch (Throwable localThrowable) {
      throw new UndeclaredThrowableException(localThrowable);
    }
  }

  public final int hashCode() {
    try {
      return ((Integer) this.h.invoke(this, m0, null)).intValue();
    } catch (RuntimeException localRuntimeException) {
      throw localRuntimeException;
    } catch (Throwable localThrowable) {
      throw new UndeclaredThrowableException(localThrowable);
    }
  }

  public final String toString() {
    try {
      return (String) this.h.invoke(this, m2, null);
    } catch (RuntimeException localRuntimeException) {
      throw localRuntimeException;
    } catch (Throwable localThrowable) {
      throw new UndeclaredThrowableException(localThrowable);
    }
  }

  static {
    try {
      m1 = Class.forName("java.lang.Object").getMethod("equals",
          new Class[] { Class.forName("java.lang.Object") });
      m4 = Class.forName("demo.IA").getMethod("b", 
          new Class[] { Class.forName("java.lang.String") });
      m3 = Class.forName("demo.IA").getMethod("a", new Class[0]);
      m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
      m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
    } catch (NoSuchMethodException localNoSuchMethodException) {
      throw new NoSuchMethodError(localNoSuchMethodException.getMessage());
    } catch (ClassNotFoundException localClassNotFoundException) {
      throw new NoClassDefFoundError(localClassNotFoundException.getMessage());
    }
  }
}
分享到:
评论

相关推荐

    代理模式-静态动态代理-jdk动态代理-cglib动态代理

    在Java中,代理模式有多种实现方式,包括静态代理、JDK动态代理和CGLIB动态代理。 **静态代理** 静态代理是最早也是最基础的代理实现方式。在静态代理中,我们需要创建一个代理类,这个代理类与原始类(被代理类)...

    动态代理-jdk、cglib、javassist.zip

    本压缩包包含关于三种主要的动态代理实现方式:JDK动态代理、CGLIB以及javassist的相关资料。 首先,JDK动态代理是Java标准库提供的一种动态代理机制,它依赖于java.lang.reflect包中的Proxy和InvocationHandler...

    java-jdk1.6-jdk-6u45-windows-x64.zip

    2. 动态代理:引入了`java.lang.reflect.Proxy`类,使得动态创建代理对象成为可能,便于实现AOP(面向切面编程)。 3. NIO.2:Java 7引入了NIO.2,但1.6版本已经包含了一些改进,如更好的文件系统访问API,异步I/O...

    aspose-words-15.8.0-jdk16.zip

    总的来说,当Maven仓库访问出现问题时,可以考虑设置代理、检查网络或使用本地库来解决问题。对于大型企业,通常会建立私有的Nexus或Artifactory仓库,以便更好地管理和分发内部使用的依赖。在Java开发中,熟练使用...

    JDK动态代理_JDK动态代理

    ### JDK动态代理详解 #### 一、引言 在软件工程中,代理模式是一种常见的设计模式,它通过为一个对象提供一个替代品或占位符来控制对这个对象的访问。这种模式通常用于添加额外的功能(例如日志记录、事务管理等)...

    Spring Aop的底层实现技术 --- Jdk动态代理原理

    Spring AOP 的底层实现技术 --- Jdk 动态代理原理 JDK 动态代理是 Spring AOP 的底层实现技术,允许开发者在运行期创建接口的代理实例。在 JDK 1.3 以后,JDK 动态代理技术提供了实现 AOP 的绝好底层技术。JDK 动态...

    spring-demo16-JDK动态代理.zip

    在Java开发中,JDK动态代理是一个非常重要的概念,它允许我们在运行时创建对已有接口的代理实现。Spring框架在很多场景下也利用了这一特性,例如AOP(面向切面编程)就是其中之一。"spring-demo16-JDK动态代理.zip...

    Spring-AOP-JDK动态代理

    本篇将详细讲解Spring中的AOP实现,特别是JDK动态代理的应用。 首先,我们要了解什么是AOP(Aspect Oriented Programming,面向切面编程)。AOP是一种编程范式,旨在解决应用程序中分散的、横切关注点的问题,如...

    jdk1.6--jdk-6u45-windows-i586.exe.zip

    6. **动态代理**:动态代理提供了在运行时创建代理对象的能力,用于实现接口的动态方法调用。 7. **NIO.2**:Java 6引入了新的I/O API,提供了更好的异步I/O操作和文件系统访问。 8. **改进的JDBC**:对JDBC API...

    java-jdk动态代理的实现demo

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理类,这些代理类可以扩展或修饰已存在的接口实现。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等,这些功能可以在不修改原始...

    day39-Spring 03-JDK的动态代理

    本文将深入探讨"day39-Spring 03-JDK的动态代理"这一主题,该主题主要关注Spring框架如何利用JDK的动态代理机制实现AOP(面向切面编程)。 首先,我们需要理解什么是动态代理。在Java中,动态代理是一种在运行时...

    JDK1.4.2-JDK1.6-JDK1.7-JDK1.8 中文帮助文档

    4. **动态代理**:允许在运行时创建实现了指定接口的代理类,用于实现AOP(面向切面编程)或动态服务。 JDK1.6是另一个重要的更新,包括以下亮点: 1. **Swing UI改进**:提供更好的外观和性能,增强了Swing组件的...

    《精通JAVA----JDK》

    动态代理则可以生成在运行时的代理类,用于实现接口的代理对象。 11. **集合框架**:包括ArrayList、LinkedList、HashSet、HashMap等,是存储和操作对象的主要工具。掌握它们的特性和使用场景,能有效提升代码的...

    OpenJDK11U-jdk_x64_linux_hotspot_11.0.6_10.tar.gz

    OpenJDK11U-jdk_x64_linux_hotspot_11.0.6_10.tar.gz 是一个针对...由于国内下载速度较慢,用户可能需要寻找镜像站点或者使用代理服务来获取。对于开发者来说,了解并正确配置OpenJDK版本是进行Java开发的基础工作。

    浅谈JDK动态代理与CGLIB代理去区别

    本篇文章将深入探讨JDK动态代理和CGLIB代理的区别,以及它们在实际应用中的选择。 首先,JDK动态代理主要依赖于java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类用于创建一个代理对象...

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

    ### 关于JDK动态代理的源码剖析 #### 一、引言 在Java开发过程中,动态代理技术是一项非常实用的技术,它可以帮助我们实现在不修改原有代码的基础上为方法增加额外的功能,比如日志记录、权限校验等。本文将深入...

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

    本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...

    AOP之JDK动态代理和CGLib动态代理

    Spring框架是AOP实现的一个典范,它提供了两种主要的动态代理方式:JDK动态代理和CGLib动态代理。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring...

Global site tag (gtag.js) - Google Analytics