欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

java 中动态代理(JDK,cglib)实例代码

时间:2021-09-07 09:10:43|栏目:JAVA代码|点击:

java 动态代理实例详解

1.jdk动态代理

/** 
 * 
 */ 
package com.sinosoft; 
 
/** 
 *接口:编写一个委托类的接口,即静态代理的(Apple接口) 
 * 
 */ 
public interface Apple { 
   
  public void phoneCall(); 
} 
 
 
 
/** 
 * 
 */ 
package com.sinosoft; 
 
/** 
 * 实现一个真正的委托类,即静态代理的(AppleImpl类) 
 * 
 */ 
public class AppleImpl implements Apple { 
 
  /* 
   * 打电话 
  */ 
  @Override 
  public void phoneCall() { 
    System.out.println("打电话"); 
  } 
 
} 
 
 
 
 
 
/** 
 * 
 */ 
package com.sinosoft; 
 
import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 
 
/** 
 * 创建一个动态代理类,实现InvocationHandler接口,并重写该invoke方法 
 * 
 */ 
public class DynamicProxy implements InvocationHandler{ 
  
   
  private Object object; 
   
  public DynamicProxy(Object object) { 
    this.object=object; 
  } 
  /* 
   * proxy参数传递的即是代理类的实例。method是调用的方法,即需要执行的方法;args是方法的参数; 
   * @param proxy 
   * @param method 
   * @param args 
   * @return 
   * @throws Throwable 
  */ 
  @Override 
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
    Object result = method.invoke(object, args); 
    return result; 
  } 
 
} 
 
 
 
 
 
 
/** 
 * 
 */ 
package com.sinosoft; 
 
import java.lang.reflect.Proxy; 
 
/** 
 * @author jdk动态代理 
 * 
 */ 
public class testDynamicProxy { 
  public static void main(String[] args) { 
    //1.创建接口的实现类 
    Apple tApple = new AppleImpl(); 
    //2.动态代理类 
    DynamicProxy tDynamicProxy = new DynamicProxy(tApple); 
    ClassLoader tClassLoader = tApple.getClass().getClassLoader(); 
    //   创建动态代理的对象,需要借助Proxy.newProxyInstance。该方法的三个参数分别是: 
    //   ClassLoader loader表示当前使用到的appClassloader。 
    //   Class<?>[] interfaces表示目标对象实现的一组接口。 
    //   InvocationHandler h表示当前的InvocationHandler实现实例对象。 
    Apple apple = (Apple) Proxy.newProxyInstance(tClassLoader, new Class[] { Apple.class }, tDynamicProxy); 
    apple.phoneCall(); 
  } 
} 

2.cglib动态代理

/** 
 * 
 */ 
package com.sinosoft; 
 
/** 
 * 实现一个真正的委托类,即静态代理的(AppleImpl类) 
 * 
 */ 
public class AppleClass{ 
  /* 
   * 打电话 
  */ 
  public void phoneCall() { 
    System.out.println("打电话"); 
  } 
 
} 
 
 
 
/** 
 * 
 */ 
package com.sinosoft; 
 
import java.lang.reflect.Method; 
 
import net.sf.cglib.proxy.MethodInterceptor; 
import net.sf.cglib.proxy.MethodProxy; 
 
/** 
 * @author Administrator 
 * 
 */ 
public class CglibProxy implements MethodInterceptor{ 
 
  /* 
   * 方法功能描述 
   * @param obj 
   * @param method 
   * @param args 
   * @param proxy 
   * @return 
   * @throws Throwable 
   * @see net.sf.cglib.proxy.MethodInterceptor#intercept(java.lang.Object, java.lang.reflect.Method, java.lang.Object[], net.sf.cglib.proxy.MethodProxy) 
  */ 
  @Override 
  public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { 
    // TODO Auto-generated method stub 
    Object object= proxy.invokeSuper(obj, args); 
    return object; 
  } 
 
} 
 
 
 
/** 
 * 
 */ 
package com.sinosoft; 
 
import net.sf.cglib.proxy.Enhancer; 
 
/** 
 * @author Administrator 
 * 
 */ 
public class TestCglibProxy { 
 
  public static void main(String[] args) { 
    CglibProxy tCglibProxy=new CglibProxy(); 
    Enhancer tEnhancer=new Enhancer(); 
    tEnhancer.setSuperclass(AppleClass.class);  
    tEnhancer.setCallback(tCglibProxy); 
     
    AppleClass tApple= (AppleClass)tEnhancer.create(); 
    tApple.phoneCall(); 
  } 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

上一篇:java Socket实现多人群聊与私聊功能

栏    目:JAVA代码

下一篇:Java微信公众平台开发(13) 微信JSSDK中Config配置

本文标题:java 中动态代理(JDK,cglib)实例代码

本文地址:http://www.codeinn.net/misctech/173248.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有