`
galpha
  • 浏览: 14395 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java动态代理分析

阅读更多

哈哈哈

Java代码 
二.源代码:   
  
被代理对象的接口及实现类:   
package com.ml.test;   
  
public interface Manager {   
public void modify();   
}   
  
package com.ml.test;   
  
public class ManagerImpl implements Manager {   
  
@Override  
public void modify() {   
   System.out.println("*******modify()方法被调用");   
}   
}   
  
业务代理类:   
package com.ml.test;   
  
import java.lang.reflect.InvocationHandler;   
import java.lang.reflect.Method;   
  
public class BusinessHandler implements InvocationHandler {   
  
private Object object = null;   
  
public BusinessHandler(Object object) {   
   this.object = object;   
}   
  
@Override  
public Object invoke(Object proxy, Method method, Object[] args)   
    throws Throwable {   
   System.out.println("do something before method");   
   Object ret = method.invoke(this.object, args);   
   System.out.println("do something after method");   
   return ret;   
  
}   
}   
  
  
  
客户端类:   
package com.ml.test;   
import java.lang.reflect.Proxy;   
public class Client {   
  
public static void main(String[] args) {   
   // 元对象(被代理对象)   
   ManagerImpl managerImpl = new ManagerImpl();   
  
   // 业务代理类   
   BusinessHandler securityHandler = new BusinessHandler(managerImpl);   
  
   // 获得代理类($Proxy0 extends Proxy implements Manager)的实例.   
   Manager managerProxy = (Manager) Proxy.newProxyInstance(managerImpl   
     .getClass().getClassLoader(), managerImpl.getClass()   
     .getInterfaces(), securityHandler);   
  
   managerProxy.modify();   
}   
}   
  
三.执行结果:   
do something before method   
*******modify()方法被调用   
do something after method   
  
四.机制分析:   
  
Proxy.(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)做了以下几件事.   
(1)根据参数loader和interfaces调用方法 getProxyClass(loader, interfaces)创建代理类$Proxy.   
$Proxy0类实现了interfaces的接口,并继承了Proxy类.   
(2)实例化$Proxy0并在构造方法中把BusinessHandler传过去,接着$Proxy0调用父类Proxy的构造器,为h赋值,如下:   
class Proxy{   
   InvocationHandler h=null;   
   protected Proxy(InvocationHandler h) {   
    this.h = h;   
   }   
   ...   
}   
  
  
  
下面是本例的$Proxy0类的源码(好不容易才把它提出来):   
  
  
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 Manager {   
  
private static Method m1;   
private static Method m0;   
private static Method m3;   
private static Method m2;   
  
static {   
   try {   
    m1 = Class.forName("java.lang.Object").getMethod("equals",   
      new Class[] { Class.forName("java.lang.Object") });   
    m0 = Class.forName("java.lang.Object").getMethod("hashCode",   
      new Class[0]);   
    m3 = Class.forName("com.ml.test.Manager").getMethod("modify",   
      new Class[0]);   
    m2 = Class.forName("java.lang.Object").getMethod("toString",   
      new Class[0]);   
   } catch (NoSuchMethodException nosuchmethodexception) {   
    throw new NoSuchMethodError(nosuchmethodexception.getMessage());   
   } catch (ClassNotFoundException classnotfoundexception) {   
    throw new NoClassDefFoundError(classnotfoundexception.getMessage());   
   }   
}   
  
public $Proxy0(InvocationHandler invocationhandler) {   
   super(invocationhandler);   
}   
  
@Override  
public final boolean equals(Object obj) {   
   try {   
    return ((Boolean) super.h.invoke(this, m1, new Object[] { obj }))   
      .booleanValue();   
   } catch (Throwable throwable) {   
    throw new UndeclaredThrowableException(throwable);   
   }   
}   
  
@Override  
public final int hashCode() {   
   try {   
    return ((Integer) super.h.invoke(this, m0, null)).intValue();   
   } catch (Throwable throwable) {   
    throw new UndeclaredThrowableException(throwable);   
   }   
}   
  
public final void modify() {   
   try {   
    super.h.invoke(this, m3, null);   
    return;   
   } catch (Error e) {   
   } catch (Throwable throwable) {   
    throw new UndeclaredThrowableException(throwable);   
   }   
}   
  
@Override  
public final String toString() {   
   try {   
    return (String) super.h.invoke(this, m2, null);   
   } catch (Throwable throwable) {   
    throw new UndeclaredThrowableException(throwable);   
   }   
}   
}   
  
接着把得到的$Proxy0实例强制转换成Manager.   
当执行managerProxy.modify()方法时,就调用了$Proxy0类中的modify()方法.   
在modify方法中,调用父类Proxy中的h的invoke()方法.   
即InvocationHandler.invoke();  

二.源代码:

被代理对象的接口及实现类:
package com.ml.test;

public interface Manager {
public void modify();
}

package com.ml.test;

public class ManagerImpl implements Manager {

@Override
public void modify() {
   System.out.println("*******modify()方法被调用");
}
}

业务代理类:
package com.ml.test;

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

public class BusinessHandler implements InvocationHandler {

private Object object = null;

public BusinessHandler(Object object) {
   this.object = object;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
   System.out.println("do something before method");
   Object ret = method.invoke(this.object, args);
   System.out.println("do something after method");
   return ret;

}
}



客户端类:
package com.ml.test;
import java.lang.reflect.Proxy;
public class Client {

public static void main(String[] args) {
   // 元对象(被代理对象)
   ManagerImpl managerImpl = new ManagerImpl();

   // 业务代理类
   BusinessHandler securityHandler = new BusinessHandler(managerImpl);

   // 获得代理类($Proxy0 extends Proxy implements Manager)的实例.
   Manager managerProxy = (Manager) Proxy.newProxyInstance(managerImpl
     .getClass().getClassLoader(), managerImpl.getClass()
     .getInterfaces(), securityHandler);

   managerProxy.modify();
}
}

三.执行结果:
do something before method
*******modify()方法被调用
do something after method

四.机制分析:

Proxy.(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)做了以下几件事.
(1)根据参数loader和interfaces调用方法 getProxyClass(loader, interfaces)创建代理类$Proxy.
$Proxy0类实现了interfaces的接口,并继承了Proxy类.
(2)实例化$Proxy0并在构造方法中把BusinessHandler传过去,接着$Proxy0调用父类Proxy的构造器,为h赋值,如下:
class Proxy{
   InvocationHandler h=null;
   protected Proxy(InvocationHandler h) {
    this.h = h;
   }
   ...
}



下面是本例的$Proxy0类的源码(好不容易才把它提出来):


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 Manager {

private static Method m1;
private static Method m0;
private static Method m3;
private static Method m2;

static {
   try {
    m1 = Class.forName("java.lang.Object").getMethod("equals",
      new Class[] { Class.forName("java.lang.Object") });
    m0 = Class.forName("java.lang.Object").getMethod("hashCode",
      new Class[0]);
    m3 = Class.forName("com.ml.test.Manager").getMethod("modify",
      new Class[0]);
    m2 = Class.forName("java.lang.Object").getMethod("toString",
      new Class[0]);
   } catch (NoSuchMethodException nosuchmethodexception) {
    throw new NoSuchMethodError(nosuchmethodexception.getMessage());
   } catch (ClassNotFoundException classnotfoundexception) {
    throw new NoClassDefFoundError(classnotfoundexception.getMessage());
   }
}

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

@Override
public final boolean equals(Object obj) {
   try {
    return ((Boolean) super.h.invoke(this, m1, new Object[] { obj }))
      .booleanValue();
   } catch (Throwable throwable) {
    throw new UndeclaredThrowableException(throwable);
   }
}

@Override
public final int hashCode() {
   try {
    return ((Integer) super.h.invoke(this, m0, null)).intValue();
   } catch (Throwable throwable) {
    throw new UndeclaredThrowableException(throwable);
   }
}

public final void modify() {
   try {
    super.h.invoke(this, m3, null);
    return;
   } catch (Error e) {
   } catch (Throwable throwable) {
    throw new UndeclaredThrowableException(throwable);
   }
}

@Override
public final String toString() {
   try {
    return (String) super.h.invoke(this, m2, null);
   } catch (Throwable throwable) {
    throw new UndeclaredThrowableException(throwable);
   }
}
}

接着把得到的$Proxy0实例强制转换成Manager.
当执行managerProxy.modify()方法时,就调用了$Proxy0类中的modify()方法.
在modify方法中,调用父类Proxy中的h的invoke()方法.
即InvocationHandler.invoke();

 
 

 

分享到:
评论

相关推荐

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

    Java 动态代理机制是Java语言提供的一种在运行时创建代理类和代理对象的机制,主要涉及`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。动态代理通常用于实现AOP(面向切面编程)、事件...

    java动态代理机制

    Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...

    Java动态代理机制分析

    Java 动态代理机制是Java反射机制的一部分,它允许开发者在运行时动态创建代理类和对象,以便在方法调用时插入自定义的行为。这种机制主要用于实现AOP(面向切面编程)和拦截器模式,提供了对方法调用的额外控制和...

    Java中的动态代理

    #### 三、动态代理示例分析 下面通过一个简单的例子来理解Java动态代理的工作原理: ```java // 定义接口 public interface HelloWorld { void sayHelloWorld(); } // 实现接口 public class HelloWorldImpl ...

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...

    基于Java动态代理和反射机制实现ORM

    在Java中,基于动态代理和反射机制实现ORM可以提高代码的可维护性和灵活性。本篇文章将深入探讨如何在Java环境下,结合MySQL数据库,利用动态代理和反射技术来实现简单的ORM框架。 首先,我们需要了解动态代理和...

    java动态代理详细解析

    Java动态代理是一种编程技术,主要用于在运行时创建一个新的对象,该对象可以作为现有接口的实现。动态代理的主要目的是为了在不修改原有代码的基础上,为已有的接口或类添加额外的功能,比如日志、事务管理、性能...

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

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

    java动态代理

    通过以上分析,我们可以看到Java动态代理是如何工作的。在实际开发中,动态代理可以用来实现很多强大的功能,如AOP中的前置通知、后置通知等。理解动态代理的工作原理对于提高代码的可维护性和扩展性非常重要。

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

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

    java动态代理类的实例

    Java动态代理是Java语言提供的一种高级特性,它允许我们在运行时创建一个代理对象来代替某个接口或类的对象,这个代理对象能够对...分析和理解这个文件的内容,可以帮助我们深入理解Java动态代理的更多细节和应用场景。

    java Proxy 动态代理

    Java的动态代理是一种强大的设计模式,它允许在运行时创建具有特定行为的代理对象,这些对象可以代替原对象执行某些任务。动态代理机制是Java语言提供的一种反射特性,主要用于实现AOP(面向切面编程)或者对现有...

    Java 动态代理Proxy应用和底层源码分析.pdf

    ### Java 动态代理Proxy应用和底层源码分析 #### 一、Java动态代理简介 Java动态代理是一种在运行时动态生成代理类的技术,通过该技术可以为一个或多个接口生成一个实现类,该实现类可以拦截接口方法的调用,并...

    Java动态代理机制综合分析及

    Java 动态代理机制是Java语言提供的一种在运行时创建代理类和代理对象的机制,主要涉及`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。这一机制使得开发者无需手动编写代理类代码,只需...

    用Java实现的代理模式之动态代理

    在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...

Global site tag (gtag.js) - Google Analytics